jetbrains.exodus.ExodusException:0毫秒后无法获取环境锁定

时间:2018-08-12 18:40:08

标签: java xodus

我们在Servlet容器上使用Xodus,并且应用程序有时会抛出此错误(我们不知道是什么原因)

jetbrains.exodus.ExodusException: Can't acquire environment lock after 0 ms.

 Lock owner info: 
null
    at jetbrains.exodus.log.Log.tryLock(Log.java:935)
    at jetbrains.exodus.log.Log.<init>(Log.java:91)
    at jetbrains.exodus.env.Environments.newLogInstance(Environments.java:137)
    at jetbrains.exodus.env.Environments.newLogInstance(Environments.java:115)
    at jetbrains.exodus.env.Environments.newLogInstance(Environments.java:104)
    at jetbrains.exodus.env.Environments.newInstance(Environments.java:49)
    at jetbrains.exodus.env.Environments.newInstance(Environments.java:39)

什么可能导致这种情况发生?

用法示例:

public void put(String instance, final String storeName, final String key, final String value) {
    final Environment env = Environments.newInstance(xodusRoot + instance);
    env.executeInTransaction(new TransactionalExecutable() {
        @Override
        public void execute(@NotNull final Transaction txn) {
            final Store store = env.openStore(storeName, StoreConfig.WITHOUT_DUPLICATES, txn);
            store.put(txn, StringBinding.stringToEntry(key), StringBinding.stringToEntry(value));
        }
    });
    env.close();
}

从Servlet端点调用此put方法的地方,因此服务器的多个并发客户端调用此方法。

2 个答案:

答案 0 :(得分:2)

这种情况发生在尝试同时访问数据库的情况下,无论是来自多个进程还是来自单个进程。文件xd.lck包含有关数据库锁所有者的可读信息。

答案 1 :(得分:1)

顺便说一句,在每个请求上打开/关闭环境效率很低。在更新环境时保持环境开放是有意义的。为了限制开放环境的数量,最好拥有一个开放环境缓存并关闭从缓存中推出的缓存。