我正在使用Berkeley DB来存储我正在构建的网络爬虫的信息。但是,在会话之间没有保存我的数据库信息!
当我启动应用程序时,每个数据库上的count()返回0.在会话结束时,在退出之前,我打印每个数据库的count()并且它已经适当地改变了但是当它我被“重置”时再次运行程序......为什么会发生这种情况?
另外,我选择不使用Transactions,因为我是单个用户,我不会在多线程环境中运行该程序。
答案 0 :(得分:2)
I just had to enable transactions to make it persistent between runs:
DatabaseConfig databaseConfig = new DatabaseConfig();
databaseConfig.setTransactional(true);
答案 1 :(得分: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(...)'命令删除该行。应该仍然有效。好吧,至少它对我有用...... :)
祝你好运
Alexander Schell
答案 2 :(得分:1)
我在Berkeley DB工作了两周。我也对同一个问题感到困惑,我最终得到了这样的结果:如果在应用程序停止运行之前关闭环境和数据库,数据将存储到一个文件中,您在打开数据库时指定其位置。程序成功终止时可以实现关闭操作。但是,如果出现故障或程序崩溃且应用程序无法在正常情况下结束,我找不到运行关闭操作的位置。
答案 3 :(得分:0)
答案是使用事务并在put请求后调用transaction.commit()。仍然不确定如何在禁用交易的情况下保存它。