使用连接池时如何关闭“本地”OrientDB?

4

所以我基本上就是这样做的。

OObjectDatabaseTx result = OObjectDatabasePool.global().acquire( "local:orientdb", "admin", "admin");
//dostuff
result.close;

问题在于,当我重新部署我的Web应用程序(而不重启Java EE容器)时,我会收到以下错误:

com.orientechnologies.orient.core.exception.OStorageException: Cannot open local storage 'orientdb' with mode=rw

我理解这句话的意思是“Tomcat仍然拥有上一个应用程序的文件锁”。
所以我的问题是,在这种情况下,我如何干净地退出?我已经尝试过:
OObjectDatabasePool.global().close()

并且

new OObjectDatabaseTx("local:orientdb").close()

但似乎两者都不起作用。有什么想法吗?文档对这个问题并不十分清晰。

1个回答

4
将属性“storage.keepOpen”设置为false:
java ... -Dstorage.keepOpen=false ...

或者通过Java代码实现:
OGlobalConfiguration.STORAGE_KEEP_OPEN.setValue( false );

我想让我的程序在使用完数据库目录后移动它,发现除了关闭数据库和所有存储(通过设置上述属性或在Orient.instance().getStorages()中的每个对象上调用close(true)),我还必须调用System.gc()才能释放文件句柄,然后才能移动目录。我还在GC之后调用了System.runFinalization()以确保一切正常。由于无法保证GC实际上会收集,因此我在循环中重试几次并休眠。我正在使用嵌入式OrientDB版本1.4.1。 - PolyTekPatrick
v1.4.1?那已经很老了。在最近的版本中,我们提供了这个新的API:Orient.instance.closeAllStorages() - Lvca
是的,由于各种原因,我还没有能够升级。关闭时重命名/移动数据库的API怎么样?不用自己调用垃圾回收器会很好。即使数据库完全损坏或文件夹并非真正的数据库,我也需要API正常工作。 - PolyTekPatrick
使用1.4.1版本时,我不记得支持哪些功能了,因为它太老了。我建议您升级到2.1版本并使用该API。 - Lvca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接