使用 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 进行数据搜索时出错的主要内容,如果未能解决你的问题,请参考以下文章