DB4O数据库大小在更新对象时增长

时间:2011-11-09 23:12:04

标签: java database db4o

我有一个java Web服务器应用程序,它每隔10秒左右就会将对象更新到数据库。

我注意到在更新时,即使没有应用任何更改,几乎每次数据库的大小都会增加几KB时。

我在这里使用了他们的例子: http://community.versant.com/documentation/reference/db4o-8.0/java/tutorial/docs/Structured.html#outline39

我尝试defrag数据库,但这并没有缩小到原始大小,其中包含相同数量的对象。

有谁能告诉我如何防止这个/我可能做错了什么?

编辑:

这是我更新或存储对象的代码的一部分(在本例中为Device):

        try {
        LinkedList<Device> lDevices = Sense.getDevices();
        if (lDevices.size() == 0) {
            return;
        }

        db = Db4o.getDatabaseClient();

        for (Device device : lDevices) {
            List<Device> query = db.queryByExample(new Device(device.getDeviceId()));

            if (query.size() == 1) {
                //store changes
                Device found = query.get(0);

                found.setBatteryLevel(device.getBatteryLevel());
                found.setLastknownLocation(device.getLastknownLocation());
                found.setType(device.getType());

                db.store(found);
            } else {
                // store new Device
                db.store(device);
            }
        }
    } catch (Exception e) {
    } finally {
        if (db instanceof ObjectContainer) {
            db.close();
        }
    }

但现在我发现使用Eclipse插件db4o数据库浏览器更新了Device对象中的Location类并再次存储在数据库中。

所以我首先在数据库中有2个设备和2个位置,在第一次更新后,数据库中有2个设备和4个位置!!这让我疯了!

有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:1)

只是为了检查:

是否将新对象和集合(尚未存储)分配给更新对象的字段。然后db4o将获取这些对象并存储它们。但是除非您删除它,否则之前引用的对象将保留在数据库中。

对于像字符串和基元这样的“值”对象,情况并非如此。

总的来说,我希望数据库首先增长。原因是db4o在新位置存储更新。但是,旧位置应标记为空闲,并可重新用于新对象/其他更新。至少在释放空间时应该释放空间。

答案 1 :(得分:0)

更新对象时,db4o实际上会复制它们,并将用于“旧”对象的空间放在可用空间列表中。

每当写入再次出现时,db4o将尝试重用此“可用空间”中的空间。

所以预计这种增长。

最佳

阿德里亚诺