有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java DB4O数据库大小随对象更新而增长

我有一个JavaWeb服务器应用程序,它每隔10秒左右更新数据库中的对象

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

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

我试图defrag数据库,但如果数据库中有相同数量的对象,这并不会减少到其原始大小

有人能告诉我如何防止这/我可能做错了什么吗

编辑:

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

        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数据库浏览器,设备对象中的Location类会被更新并再次存储在数据库中

因此,我在数据库中有2个设备和2个位置,在第一次更新后,数据库中有2个设备和4个位置!!这简直快把我逼疯了

有人知道为什么会这样吗


共 (2) 个答案

  1. # 1 楼答案

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

    每当再次写入时,db4o将尝试重用这个“空闲空间”中的空间

    所以这种增长是可以预期的

    最好的

    阿德里亚诺

  2. # 2 楼答案

    只是想确认一下:

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

    对于字符串和原语等“值”对象,情况并非如此

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