私はdb4o 8.0を使用しています。
クラスがあります
PostedMessage{
@Indexed
long receivedTime;
@Indexed
long sentTime;
...
//getter methods and setter methods for all the fields.
}
PostedMessage オブジェクトを db4o データベースに永続化します。既に 15000 以上のオブジェクトを db4o データベースに保存しています。そして、次のクエリを実行すると、OutOfMemoryError が発生します。
//Query to get PostedMessages between "start" and "end" dates.
Query q = db.query();
q.constrain(PostedMessage.class);
Constraint from = q.descend("receivedTime").constrain(new Long(start.getTimeInMillis())).greater().equal();
q.descend("receivedTime").constrain(new Long(end.getTimeInMillis())).smaller().equal().and(from);
q.execute();//results in OutOfMemoryError
OutOfMemoryError を回避するには、PostedMessage クラスのフィールドにインデックスを追加する必要があります。これを読んでください。
サーバー/クライアント構成があります。ObjectContainer を開く前に事前設定することはできません。
ObjectContainer を開いて提供した後で、インデックス作成 CommonConfiguration を適用/追加する必要があります。
構成を作成する方法を知っています。
EmbeddedConfiguration appendConfig = Db4oEmbedded.newConfiguration();
appendConfig.common().objectClass(EmailMessage.class).objectField("receivedTime").indexed(true);
appendConfig.common().objectClass(EmailMessage.class).objectField("sentTime").indexed(true);
この構成を既に開いている ObjectContainer に適用する方法がわかりません。開いたばかりの ObjectContainer にインデックスを追加するにはどうすればよいですか?
EmbeddedConfigurationItem の apply()メソッドが答えですか? 使用できる場合、使用方法を示すサンプル コードを入手できますか?
編集: @Indexed アノテーションを後で質問に追加しました。