【问题标题】:DB4O database size growing on updating objectsDB4O 数据库大小随着对象的更新而增长
【发布时间】:2011-11-09 23:12:04
【问题描述】:

我有一个 Java Web 服务器应用程序,它每 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 个位置!!这让我发疯了!

有人知道为什么会这样吗?

【问题讨论】:

  • 如果 device.getLastknownLocation() 返回的对象不是从数据库中检索到的,它将被存储(因为 db4o 认为它是一个新对象)。
  • 好的,我找到的解决方案是需要先删除in-dept-objects,否则它们将被存储两次。感谢 Vagaus 和 Gamlor 的帮助!

标签: java database db4o


【解决方案1】:

只是为了检查:

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

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

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

【讨论】:

  • 我已经用我用来更新数据库的代码更新了我的问题。如果您知道如何解决此问题,请告诉我?
  • 看来我的问题是你的第一点。 “设备”中的对象“位置”不是来自数据库。现在我尝试了这个: // 首先从 db 中删除旧对象 db.delete(found.getLastknownLocation()); found.setLastknownLocation(device.getLastknownLocation());数据库仍在增长,但变得更小,几乎是碎片整理后的原始大小。我想这是在我的“设备”对象中更新“位置”等深入对象的方法吗?
【解决方案2】:

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

每当再次写入时,db4o 都会尝试重用此“空闲空间”中的空间。

所以这种增长是预期的。

最好的

阿德里亚诺

【讨论】:

    猜你喜欢
    • 2019-10-06
    • 1970-01-01
    • 2020-11-22
    • 2017-11-22
    • 1970-01-01
    • 2021-12-30
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多