Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DB4O数据库大小随对象更新而增长_Java_Database_Db4o - Fatal编程技术网

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

Java DB4O数据库大小随对象更新而增长,java,database,db4o,Java,Database,Db4o,我有一个JavaWeb服务器应用程序,它每隔10秒左右更新数据库中的对象 我注意到,在更新时,即使没有应用任何更改,几乎每次数据库的大小都会增长几KB 我在这里用了他们的例子: 我尝试过删除数据库,但如果数据库中的对象数量相同,则不会缩小到其原始大小 有人能告诉我如何防止这/我可能做错了什么吗 编辑: 这是我更新或存储对象(本例中为设备)的代码部分: 试试看{ LinkedList lDevices=Sense.getDevices(); 如果(lDevices.size()==0){ 返回;

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

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

我在这里用了他们的例子:

我尝试过删除数据库,但如果数据库中的对象数量相同,则不会缩小到其原始大小

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

编辑:

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

试试看{
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();
        }
    }