我有一个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个位置!!这让我疯了!
有谁知道为什么会这样?
答案 0 :(得分:1)
只是为了检查:
是否将新对象和集合(尚未存储)分配给更新对象的字段。然后db4o将获取这些对象并存储它们。但是除非您删除它,否则之前引用的对象将保留在数据库中。
对于像字符串和基元这样的“值”对象,情况并非如此。
总的来说,我希望数据库首先增长。原因是db4o在新位置存储更新。但是,旧位置应标记为空闲,并可重新用于新对象/其他更新。至少在释放空间时应该释放空间。
答案 1 :(得分:0)
更新对象时,db4o实际上会复制它们,并将用于“旧”对象的空间放在可用空间列表中。
每当写入再次出现时,db4o将尝试重用此“可用空间”中的空间。
所以预计这种增长。
最佳
阿德里亚诺