2012-03-19 43 views
1

我正在使用Berkeley DB来存储我正在构建的网络爬虫的信息。然而,我的数据库信息没有被保存在会话之间!Berkeley DB(Java版)在应用程序运行之间不是持久性的

当我启动应用程序时,每个数据库的count()返回0.在会话结束时,在退出之前,我打印每个数据库的count(),并且它已经适当地更改,但是当它被“重置”时我再次运行该程序...为什么会发生这种情况?

此外,我选择不使用Transactions,因为我是单个用户,我不会在多线程环境中运行该程序。

+0

所以,如果你不使用交易,你在用什么?你有什么声明或过程接近'txn.commit()'? – APC 2012-03-19 15:44:56

+0

我没有这种性质的任何东西(尽管我在某些时候尝试运行Database.sync())。我认为交易是可选的,如果伯克利数据库,如果你禁用它们......如果不是为什么我可以禁用它们?我不太了解交易,所以这是我没有使用它们的另一个原因。这是我的问题吗? – 2012-03-19 15:49:29

+1

*我不太了解交易* ...如果您打算使用数据库,您应该了解交易是什么。这是数据库的基础之一。 – 2012-03-19 15:59:40

回答

0

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

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' 为 '真'。然后你可以在你的数据库上使用'sync()'并且数据被保存。运行它,然后使用'put(...)'命令删除该行。应该仍然有效。嗯,至少它为我工作... :)

问候

亚历山大·谢尔

+0

这是很久以前我不再有权访问的代码。我很欣赏答案,希望我可以尝试并确认它是否有效。 – 2013-07-25 17:32:50

1

我不得不使交易让它持续运行之间:

DatabaseConfig databaseConfig = new DatabaseConfig(); 
databaseConfig.setTransactional(true); 
1

我我在过去的两周里一直在Berkeley DB工作。我也对同样的问题感到困惑,并且最终导致了这种情况:如果在应用程序停止运行之前关闭环境和数据库,则数据将存储到一个文件中,该文件在打开数据库时指定其位置。程序成功终止时可以关闭操作。但是,如果出现故障或者程序崩溃,并且应用程序在正常情况下无法结束,那么我无法找到运行关闭操作的位置。

相关问题