我正在使用Berkeley DB为我正在构建的网络爬虫存储信息。然而,我的数据库信息没有在会话之间保存!
当我启动应用程序时,每个DB上的count()都返回0。在会话结束时,在退出之前,我为每个DB打印count(),它已经发生了适当的更改,但当我再次运行程序时,它被"重置"了。。。为什么会发生这种情况?
此外,我选择不使用事务,因为我是一个单一用户,不会在多线程环境中运行程序。
我只需要启用事务,使其在运行之间持久化:
DatabaseConfig databaseConfig = new DatabaseConfig();
databaseConfig.setTransactional(true);
我在Berkeley DB上工作了两周。我也对同样的问题感到困惑,最终我得出了这样的结论:如果你在应用程序停止运行之前关闭了环境和数据库,那么数据会存储在一个文件中,你在打开数据库时会指定它的位置。当程序成功终止时,可以实现关闭操作。然而,如果出现故障或程序崩溃,并且应用程序在正常情况下无法结束,我还找不到在哪里运行关闭操作。
答案是使用transactions并在put请求后调用transaction.commit()。仍然不确定如何在禁用事务的情况下保存它。
也许这会有所帮助:
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(…)"-命令删除行。应该仍然有效。好吧,至少它对我有效…:)
向致以最良好的问候
Alexander Schell