我正在使用Berkeley DB来存储我正在构建的网络爬虫的信息。然而,我的数据库信息没有被保存在会话之间!Berkeley DB(Java版)在应用程序运行之间不是持久性的
当我启动应用程序时,每个数据库的count()返回0.在会话结束时,在退出之前,我打印每个数据库的count(),并且它已经适当地更改,但是当它被“重置”时我再次运行该程序...为什么会发生这种情况?
此外,我选择不使用Transactions,因为我是单个用户,我不会在多线程环境中运行该程序。
我正在使用Berkeley DB来存储我正在构建的网络爬虫的信息。然而,我的数据库信息没有被保存在会话之间!Berkeley DB(Java版)在应用程序运行之间不是持久性的
当我启动应用程序时,每个数据库的count()返回0.在会话结束时,在退出之前,我打印每个数据库的count(),并且它已经适当地更改,但是当它被“重置”时我再次运行该程序...为什么会发生这种情况?
此外,我选择不使用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' 为 '真'。然后你可以在你的数据库上使用'sync()'并且数据被保存。运行它,然后使用'put(...)'命令删除该行。应该仍然有效。嗯,至少它为我工作... :)
问候
亚历山大·谢尔
这是很久以前我不再有权访问的代码。我很欣赏答案,希望我可以尝试并确认它是否有效。 – 2013-07-25 17:32:50
我不得不使交易让它持续运行之间:
DatabaseConfig databaseConfig = new DatabaseConfig();
databaseConfig.setTransactional(true);
我我在过去的两周里一直在Berkeley DB工作。我也对同样的问题感到困惑,并且最终导致了这种情况:如果在应用程序停止运行之前关闭环境和数据库,则数据将存储到一个文件中,该文件在打开数据库时指定其位置。程序成功终止时可以关闭操作。但是,如果出现故障或者程序崩溃,并且应用程序在正常情况下无法结束,那么我无法找到运行关闭操作的位置。
所以,如果你不使用交易,你在用什么?你有什么声明或过程接近'txn.commit()'? – APC 2012-03-19 15:44:56
我没有这种性质的任何东西(尽管我在某些时候尝试运行Database.sync())。我认为交易是可选的,如果伯克利数据库,如果你禁用它们......如果不是为什么我可以禁用它们?我不太了解交易,所以这是我没有使用它们的另一个原因。这是我的问题吗? – 2012-03-19 15:49:29
*我不太了解交易* ...如果您打算使用数据库,您应该了解交易是什么。这是数据库的基础之一。 – 2012-03-19 15:59:40