日期:2014-05-18  浏览次数:20665 次

db4o中明明存在却“找不到对象”的bug,如何解决?
db4o版本6.0,
最初使用db4o时没有打开索引,一直没有碰到问题,后来因为数据量大(对象数量几十万),查找对象的速度明显下降,所以开启了索引,但是从此以后隔三差五的会检索出null来(正确的情况下是肯定能取到对象的,而且这个null现象也不是一定能重现,有时重起tomcat又能找到了)。

不知道有没有朋友碰到和我一样的问题?
以及你们是如何解决的?

欢迎有db4o使用经验的朋友一起探讨db4o的使用经验。

------解决方案--------------------
没遇到过
------解决方案--------------------
自己顶起……
------解决方案--------------------
遇到null的问题,不是重启tomcat才好的,好好检查下
------解决方案--------------------
我们已经仔细的跟踪过代码的运行情况,不管是调试信息输出,还是单步跟踪执行,都证实了是db4o的奇怪行为所引起;
而关闭db4o的索引之后,一直没有出现过该现象。

所以暂时确定为db4o引起。
确实,代码可以很简单,现象就是很奇怪,现在怀疑是db4o的bug。

大家继续!

------解决方案--------------------
再贴几行我们的代码,把问题说得清楚点。

db = Db4o.openFile(configFilename);
query = db.query();
query.constrain(AAA.class);
query.descend( "id ").constrain(id);

ObjectSet objSet = query.execute();
if (objSet != null && !objSet.isEmpty())
{
return (AAA)objSet.get(0);
}

我们确定配置文件中已经存在需要查询的对象,只是现在需要取出来,
但是以上这几行代码在打开索引的情况下有时行,有时不行;
而不打开索引时,一直都没有出现过问题。

更需要指出的是,
如果上面的代码没有得到结果,那么继续下面的代码,还是能够从yap中找到我们需要的对象的:

query = db.query();
query.constrain(AAA.class);
List ret = query.execute();
for(Object obj : ret)
{
//在此依次判断
if( ((AAA)obj).getId().equals(id) )
{
return obj;
}
}

问题似乎集中在 id 属性的条件过滤上。我们所使用的id是String类型的。
------解决方案--------------------
自己顶起!
------解决方案--------------------
这样写 List <Page> pages = db.query(Page.class); 有的时候取不到任何数据。
------解决方案--------------------
我也急啊..帮顶
------解决方案--------------------
陈年老贴了,问题还是没有解决,自己顶起!
------解决方案--------------------
先写了判断再说看查出的东西是不是空
------解决方案--------------------
在5楼已经说了,
不同的查询方法,得到不同的结果。

然而,并不是每次都这样。
开启索引功能,偶尔会这样,不开索引功能,从来没有碰到过这样的事情。

所以,怀疑是db4o的索引存在bug。