Java DB4O数据库大小随对象更新而增长
我有一个JavaWeb服务器应用程序,它每隔10秒左右更新数据库中的对象 我注意到,在更新时,即使没有应用任何更改,几乎每次数据库的大小都会增长几KB 我在这里用了他们的例子: 我尝试过删除数据库,但如果数据库中的对象数量相同,则不会缩小到其原始大小 有人能告诉我如何防止这/我可能做错了什么吗 编辑: 这是我更新或存储对象(本例中为设备)的代码部分:Java DB4O数据库大小随对象更新而增长,java,database,db4o,Java,Database,Db4o,我有一个JavaWeb服务器应用程序,它每隔10秒左右更新数据库中的对象 我注意到,在更新时,即使没有应用任何更改,几乎每次数据库的大小都会增长几KB 我在这里用了他们的例子: 我尝试过删除数据库,但如果数据库中的对象数量相同,则不会缩小到其原始大小 有人能告诉我如何防止这/我可能做错了什么吗 编辑: 这是我更新或存储对象(本例中为设备)的代码部分: 试试看{ LinkedList lDevices=Sense.getDevices(); 如果(lDevices.size()==0){ 返回;
试试看{
LinkedList lDevices=Sense.getDevices();
如果(lDevices.size()==0){
返回;
}
db=Db4o.getDatabaseClient();
用于(设备:lDevices){
List query=db.queryByExample(新设备(Device.getDeviceId());
if(query.size()==1){
//存储更改
找到的设备=query.get(0);
已找到.setBatteryLevel(device.getBatteryLevel());
已找到.setLastknownLocation(device.getLastknownLocation());
找到.setType(device.getType());
数据库存储(已找到);
}否则{
//存储新设备
数据库存储(设备);
}
}
}捕获(例外e){
}最后{
if(ObjectContainer的数据库实例){
db.close();
}
}
但是现在我发现使用Eclipse插件db4o数据库浏览器,设备对象中的Location类会被更新并再次存储在数据库中
因此,我在数据库中有2个设备和2个位置,在第一次更新后,数据库中有2个设备和4个位置!!这简直快把我逼疯了
有人知道为什么会发生这种情况吗?请检查:
是否将新对象和集合(尚未存储)分配给更新对象的字段。然后db4o将获取这些对象并存储它们。但之前引用的对象将保留在数据库中,除非您将其删除
对于字符串和原语等“值”对象,情况并非如此
总之,总的来说,我希望数据库首先增长。原因是db4o在一个新的位置存储了一个更新的文件。但是,旧位置应标记为空闲,并可重新用于新对象/其他更新。至少在消除碎片时,应释放空间。请检查:
是否将新对象和集合(尚未存储)分配给更新对象的字段。然后db4o将获取这些对象并存储它们。但之前引用的对象将保留在数据库中,除非您将其删除
对于字符串和原语等“值”对象,情况并非如此
总之,总的来说,我希望数据库首先增长。原因是db4o在一个新的位置存储了一个更新的文件。但是,旧位置应标记为空闲,并可重新用于新对象/其他更新。至少在消除碎片时,应该释放空间。当您更新对象时,db4o实际上会复制它们,并将用于“旧”对象的空间放在可用空间列表中 每当再次写入时,db4o将尝试重用这个“空闲空间”中的空间 因此,这种增长是可以预期的 最好的
Adriano当您更新对象时,db4o实际上会复制它们,并将用于“旧”对象的空间放在可用空间列表中 每当再次写入时,db4o将尝试重用这个“空闲空间”中的空间 因此,这种增长是可以预期的 最好的
阿德里亚诺我已经用我用来更新数据库的代码更新了我的问题。你能告诉我,如果你知道我如何解决这个问题吗?看来我的问题是你的第一点。“设备”中的对象“位置”不是来自数据库。现在我尝试了以下方法://首先从db.delete(find.getLastknownLocation())中删除旧对象;已找到.setLastknownLocation(device.getLastknownLocation());数据库仍在增长,但会变小,几乎是碎片整理后的原始大小。我想这是更新部门内对象的方法,比如我的“设备”对象中的“位置”?我已经用我用来更新数据库的代码更新了我的问题。你能告诉我,如果你知道我如何解决这个问题吗?看来我的问题是你的第一点。“设备”中的对象“位置”不是来自数据库。现在我尝试了以下方法://首先从db.delete(find.getLastknownLocation())中删除旧对象;已找到.setLastknownLocation(device.getLastknownLocation());数据库仍在增长,但会变小,几乎是碎片整理后的原始大小。我想这是更新部门内对象(如我的“设备”对象中的“位置”)的方法吗?如果设备.getLastknownLocation()返回一个未从数据库检索到的对象,它将被存储(因为db4o认为这是一个新对象)。好的,我发现的解决方案是需要先删除部门内对象,否则它们将被存储两次。感谢Vagaus和Gamlor的帮助!如果device.getLastknownLocation()返回一个未从数据库中检索到的对象,它将被存储(因为db4o认为它是一个新对象)。好的,我找到的解决方案是需要先删除dept中的对象,否则它们将被存储两次。感谢Vagaus和Gamlor的帮助!
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();
}
}