【问题标题】:Closing a "local" OrientDB when using connection pools使用连接池时关闭“本地”OrientDB
【发布时间】:2013-08-22 14:22:14
【问题描述】:

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

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()

但似乎两者都不起作用。有任何想法吗?文档对此问题并不十分清楚。

【问题讨论】:

    标签: local connection-pooling orientdb file-storage


    【解决方案1】:

    将属性“storage.keepOpen”设置为false:

    java ... -Dstorage.keepOpen=false ...
    

    或通过 Java 代码:

    OGlobalConfiguration.STORAGE_KEEP_OPEN.setValue( false );
    

    【讨论】:

    • 我希望我的程序在使用后移动数据库目录,发现除了关闭数据库和所有存储之外(通过设置上述属性或在每个对象上调用 close(true)在 Orient.instance().getStorages()) 中,我还必须调用 System.gc() 才能真正释放文件句柄,然后才能移动目录。我还在 GC 之后调用了 System.runFinalization() 以进行良好的衡量。我在睡眠中循环重试几次,因为不能保证 GC 会实际收集。我正在使用嵌入在我的进程中的 OrientDB 版本 1.4.1。
    • v1.4.1?那是相当老了。在最近的版本中,我们提供了这个新的 API:Orient.instance.closeAllStorages()
    • 是的,由于各种原因,我还没有升级。关闭时重命名/移动数据库的 API 怎么样?不用自己打电话给垃圾收集器就好了。即使数据库完全损坏或文件夹不是真正的数据库,我也需要 API 工作。
    • 1.4.1 我不记得支持了什么,它太旧了。我建议您升级到 2.1 并使用该 API。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 2018-04-11
    • 1970-01-01
    相关资源
    最近更新 更多