使用 berkeley DB 进行数据搜索时出错

Posted

技术标签:

【中文标题】使用 berkeley DB 进行数据搜索时出错【英文标题】:error in dataSearch using berkley DB 【发布时间】:2013-11-22 04:06:32 【问题描述】:

我使用 Berkley DB 创建了一个数据库,该数据库存储 N 条记录,其中一条记录是键/值对。我最初只用 20 条记录填充它。使用 20 条记录,我设法进行了键搜索和数据搜索(我在数据库中逐条记录搜索与用户输入的字符串数据匹配的数据值)。

public String dataSearch (String dataInput) 
    String foundKey = null;
    String foundData = null;
    Cursor cursor = null;
    try 
        cursor = myDb.openCursor(null, null);
        DatabaseEntry theKey = new DatabaseEntry();
        DatabaseEntry theData = new DatabaseEntry();
        while (cursor.getNext(theKey, theData, LockMode.DEFAULT) == OperationStatus.SUCCESS) 
            foundKey = new String(theKey.getData(), "UTF-8");
            foundData = new String(theData.getData(), "UTF-8");
                // this is to see each key - data - inputdata as I was having an issue
            System.out.println("KEY: " + foundKey + 
                    "\nDATA: " + foundData +
                    "\nINPUT_DATA: " + dataInput + "\n\n");

            if (foundData.equals(dataInput)) 
                System.out.println("-----------------------------------\n\n");
                System.out.println("Found record: " + foundKey +
                            "\nwith data: " + foundData);
                System.out.println("\n\n-----------------------------------");
            
        

 /* I then close the cursor and catch exceptions and such */

当我的记录少于(或等于)20 条时,这可以正常工作......但是当我使用更大的数字时,我似乎有一些有趣的行为。我将记录数设置为 1000...要插入数据库的最后一个键/数据值是:

KEY: zghxnbujnsztazmnrmrlhjsjfeexohxqotjafliiktlptsquncuejcrebaohblfsqazznheurdqbqbxjmyqr

DATA: jzpqaymwwnoqzvxykowdhxvfbuhrsfojivugrmvmybbvurxmdvmrclalzfscmeknyzkqmrcflzdooyupwznvxikermrbicapynwspbbritjyeltywmmslpeuzsmh

我让它打印出要插入数据库的最后一个值,然后对上面的键进行键搜索,以确保上面的数据实际上是与数据库中该键关联的数据。但是,当我对上面列出的数据进行数据搜索时,我没有找到匹配的记录(而同一进程在有 20 条记录时找到了一条记录)。我对其进行了更多研究,并让每个我的数据搜索打印它返回的每个键/数据对,并找到以下结果:

KEY: zghxnbujnsztazmnrmrlhjsjfeexohxqotjafliiktlptsquncuejcrebaohblfsqazznheurdqbqbxjmyqrpzlyvnmdlvgyvzhbceeftcqssbeckxkuepxyphsgdzd
DATA: jzpqaymwwnoqzvxykowdhxvfbuhrsfojivugrmvmybbvurxmdvmrclalzfscmeknyzkqmrcflzdooyupwznvxikermrbicapynwspbbritjyeltywmmslpeuzsmhozy
INPUT DATA: jzpqaymwwnoqzvxykowdhxvfbuhrsfojivugrmvmybbvurxmdvmrclalzfscmeknyzkqmrcflzdooyupwznvxikermrbicapynwspbbritjyeltywmmslpeuzsmh

如您所见,它似乎在数据值中随机附加了一些额外的字节。但是,如果我进行关键搜索,这些额外的字节就不会出现。所以我认为问题出在 dataSearch 功能上。如果我使用 b+tree 或哈希,也会出现相同的结果。

有什么想法吗?

谢谢

【问题讨论】:

【参考方案1】:

看了很长时间后,我意识到我的错误是我没有重新初始化 theKey 和 theData 变量。

修复在 while 循环中

       while (cursor.getNext(theKey, theData, LockMode.DEFAULT) == OperationStatus.SUCCESS) 
            foundKey = new String(theKey.getData(), "UTF-8");
            foundData = new String(theData.getData(), "UTF-8");
                // this is to see each key - data - inputdata as I was having an issue
            System.out.println("KEY: " + foundKey + 
                    "\nDATA: " + foundData +
                    "\nINPUT_DATA: " + dataInput + "\n\n");

            if (foundData.equals(dataInput)) 
                System.out.println("-----------------------------------\n\n");
                System.out.println("Found record: " + foundKey +
                            "\nwith data: " + foundData);
                System.out.println("\n\n-----------------------------------");
            
            // THIS IS THE FIX 
            theKey = new DatabaseEntry();
            theData = new DatabaseEntry();
            // ----------------------------

        

【讨论】:

以上是关于使用 berkeley DB 进行数据搜索时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 berkeley db 实现缓存

从 Java 中的另一个类访问 berkeley db

在 Berkeley DB Core 和 Berkeley DB JE 之间进行选择

Berkeley DB:仅检索密钥

无法从 C 中的 Berkeley DB 检索值

Berkeley DB 无法在不关闭数据库的情况下访问数据