我正在使用 Berkeley DB 来存储我正在构建的网络爬虫的信息。但是,我的数据库信息都没有在会话之间保存!
当我启动应用程序时,每个 DB 上的 count() 返回 0。在会话结束时,在退出之前,我打印每个 DB 的 count(),它已经适当地改变了,但是当我运行程序时它是“重置”的再次......为什么会这样?
另外,我选择不使用事务,因为我是单个用户,并且不会在多线程环境中运行程序。
我正在使用 Berkeley DB 来存储我正在构建的网络爬虫的信息。但是,我的数据库信息都没有在会话之间保存!
当我启动应用程序时,每个 DB 上的 count() 返回 0。在会话结束时,在退出之前,我打印每个 DB 的 count(),它已经适当地改变了,但是当我运行程序时它是“重置”的再次......为什么会这样?
另外,我选择不使用事务,因为我是单个用户,并且不会在多线程环境中运行程序。
我只需要启用事务以使其在运行之间持久化:
DatabaseConfig databaseConfig = new DatabaseConfig();
databaseConfig.setTransactional(true);
最近两周我一直在研究 Berkeley DB。我也对同样的问题感到困惑,最终得出了这个结论:如果您在应用程序停止运行之前关闭环境和数据库,则数据将存储到您在打开数据库时指定其位置的文件中。程序终止成功后,即可实现关闭操作。但是,如果出现故障或程序崩溃并且在正常情况下无法结束应用程序,我还找不到在哪里运行关闭操作。
答案是在 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(...)”命令删除该行。应该还能工作。好吧,至少它对我有用...... :)
最好的祝福
亚历山大·谢尔