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个位置!!这简直快把我逼疯了
有人知道为什么会这样吗
# 1 楼答案
更新对象时,db4o实际上会复制它们,并将用于“旧”对象的空间放在可用空间列表中
每当再次写入时,db4o将尝试重用这个“空闲空间”中的空间
所以这种增长是可以预期的
最好的
阿德里亚诺
# 2 楼答案
只是想确认一下:
是否将新对象和集合(尚未存储)分配给更新对象的字段。然后db4o将获取这些对象并存储它们。但之前被引用的对象将保留在数据库中,除非您将其删除
对于字符串和原语等“值”对象,情况并非如此
总之,总的来说,我希望数据库首先增长。原因是db4o在一个新的位置存储了一个更新的文件。但是,旧位置应标记为空闲,并重新用于新对象/其他更新。至少在清理碎片时,应该释放空间