10秒ごとにオブジェクトをデータベースに更新するJava Webサーバーアプリケーションがあります。オブジェクトの更新時にDB4Oデータベースのサイズが増加する
私が気付いたのは、変更が適用されなくても、データベースのサイズが数KB増加するたびに更新されます。
私はここで自分の例を使用しました: http://community.versant.com/documentation/reference/db4o-8.0/java/tutorial/docs/Structured.html#outline39
私は、データベースをdefragしようとしたが、これはその中のオブジェクトの同じ量を元のサイズに減らすことはありません。
誰でも私にこれを防ぐ方法/私が間違っている可能性があることを教えてもらえますか?
EDIT:
これは私がオブジェクト(この場合は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つの場所があります。これは私をナットにしている!
これはなぜ起こるのですか?
を使用すると、更新オブジェクトのフィールドに(まだ保存されていない)新しいオブジェクトやコレクションを割り当ててください:ちょうどチェックする
device.getLastknownLocation(もし)は(db4oのは、それが新しいオブジェクトであると考えているので)、それが保存されますDBから取得されなかったオブジェクトを返します。 – Vagaus
私が見つけた解決策は、in-deptオブジェクトを最初に削除する必要があるか、または2回保存する必要があるということです。 VagausとGamlorのおかげで助けになりました! –