2011-11-09 15 views
1

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つの場所があります。これは私をナットにしている!

これはなぜ起こるのですか?

を使用すると、更新オブジェクトのフィールドに(まだ保存されていない)新しいオブジェクトやコレクションを割り当ててください:ちょうどチェックする

+0

device.getLastknownLocation(もし)は(db4oのは、それが新しいオブジェクトであると考えているので)、それが保存されますDBから取得されなかったオブジェクトを返します。 – Vagaus

+0

私が見つけた解決策は、in-deptオブジェクトを最初に削除する必要があるか、または2回保存する必要があるということです。 VagausとGamlorのおかげで助けになりました! –

答えて

1

。その後、db4oはそれらのオブジェクトを取り出して保存します。しかし、あなたがそれを削除しない限り、以前に参照されたオブジェクトはデータベースにとどまります。

これは、文字列やプリミティブのような 'value'オブジェクトの場合には当てはまりません。

とにかく一般的には、データベースが最初に成長すると思います。その理由は、db4oが更新された場所を新しい場所に保存するからです。しかし、古い場所は空きとしてマークされ、新しいオブジェクト/その他の更新に再利用されるべきです。少なくとも、デフラグを解除すると解放されるはずです。

+0

データベースの更新に使用するコードで質問を更新しました。どうすればこの問題を解決できるか知っているか教えてください。 –

+0

私の問題はあなたの最初の点であるように見えます。'Device'のオブジェクト 'Location'はデータベースからのものではありません。 私はこれを試しました: //古いオブジェクトをまずdbから削除します db.delete(found.getLastknownLocation()); found.setLastknownLocation(device.getLastknownLocation()); データベースはまだ拡張されていますが、断片化が解消された後は元のサイズにほとんど変わりません。これは私の 'Device'オブジェクトの 'Location'のようなin-dept-objectsを更新する方法ですか? –

0

オブジェクトを更新すると、db4oは実際にそれらを複製し、 "古い"オブジェクトに使用された領域を空き領域のリストに入れます。

もう一度書き込みが行われるたびに、db4oはこの「空き領域」の領域を再利用しようとします。

このような成長が期待されます。

ベスト

アドリアーノ

関連する問題