2

構築中の Web クローラーの情報を保存するために Berkeley DB を使用しています。ただし、セッション間でデータベース情報が保存されていません!

アプリケーションを起動すると、すべての DB で count() が 0 を返します。セッションの最後に、終了する前に、各 DB の count() を出力し、適切に変更されましたが、プログラムを実行すると「リセット」されます。また…どうしてこうなった?

また、私は単一のユーザーであり、マルチスレッド環境でプログラムを実行しないため、トランザクションを使用しないことを選択しています。

4

4 に答える 4

2

過去 2 週間、Berkeley DB に取り組んでいます。私も同じ質問に戸惑いましたが、最終的には次のようになりました。アプリの実行が停止する前に環境とデータベースを閉じると、データベースを開くときにその場所を指定したファイルにデータが保存されます。プログラムが正常に終了している場合は、クローズ操作を実行できます。ただし、障害が発生したり、プログラムがクラッシュしたりして、通常の状態でアプリケーションを終了できない場合、終了操作を実行する場所がまだ見つかりませんでした。

于 2016-04-28T14:27:21.847 に答える
2

トランザクションを有効にして、実行間で永続化する必要がありました。

DatabaseConfig databaseConfig = new DatabaseConfig();
databaseConfig.setTransactional(true);
于 2015-05-18T18:02:58.520 に答える
1

おそらくこれが役立つかもしれません:

EnvironmentConfig environmentConfig = new EnvironmentConfig();
environmentConfig.setAllowCreate(true);
File file = new File("<Path_to_Database>");
Environment environment = new Environment(file, environmentConfig);

DatabaseConfig databaseConfig = new DatabaseConfig();
databaseConfig.setAllowCreate(true);
databaseConfig.setDeferredWrite(true);

Database testDatabase = environment.openDatabase(null, "testDB", databaseConfig);

DatabaseEntry keyEntry = new DatabaseEntry();
DatabaseEntry valueEntry = new DatabaseEntry();
DatabaseEntry fetchedEntry = new DatabaseEntry();

IntegerBinding.intToEntry(1, keyEntry);
StringBinding.stringToEntry("Kwakkel", valueEntry);

testDatabase.put(null, keyEntry, valueEntry);


testDatabase.get(null, keyEntry, fetchedEntry, null);
String fetched = StringBinding.entryToString(fetchedEntry);

System.out.println("Fetched value: " + fetched);

testDatabase.sync();
testDatabase.close();

「DeferredWrite」を「true」に設定する必要があると思います。次に、データベースで「sync()」を使用すると、データが永続化されます。それを実行してから、「put(...)」コマンドで行を削除します。まだ動作するはずです。まあ、少なくともそれは私のために働いた... :)

よろしくお願いします

アレクサンダー・シェル

于 2013-07-25T09:58:10.780 に答える
1

その答えは、トランザクションを使用し、put リクエストの後に transaction.commit() を呼び出すことでした。トランザクションを無効にして保存する方法がまだわかりません。

于 2012-03-20T19:18:17.993 に答える