2

我正在使用 Berkeley DB 来存储我正在构建的网络爬虫的信息。但是,我的数据库信息都没有在会话之间保存!

当我启动应用程序时,每个 DB 上的 count() 返回 0。在会话结束时,在退出之前,我打印每个 DB 的 count(),它已经适当地改变了,但是当我运行程序时它是“重置”的再次......为什么会这样?

另外,我选择不使用事务,因为我是单个用户,并且不会在多线程环境中运行程序。

4

4 回答 4

2

我只需要启用事务以使其在运行之间持久化:

DatabaseConfig databaseConfig = new DatabaseConfig();
databaseConfig.setTransactional(true);
于 2015-05-18T18:02:58.520 回答
2

最近两周我一直在研究 Berkeley DB。我也对同样的问题感到困惑,最终得出了这个结论:如果您在应用程序停止运行之前关闭环境和数据库,则数据将存储到您在打开数据库时指定其位置的文件中。程序终止成功后,即可实现关闭操作。但是,如果出现故障或程序崩溃并且在正常情况下无法结束应用程序,我还找不到在哪里运行关闭操作。

于 2016-04-28T14:27:21.847 回答
1

答案是在 put 请求后使用事务并调用 transaction.commit()。仍然不确定如何在禁用事务的情况下保存它。

于 2012-03-20T19:18:17.993 回答
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 回答