猿问

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

我们在一个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();

}

如果这put方法是从一个Servlet端点调用,服务器因此多个并发客户端调用此方法。


ibeautiful
浏览 245回答 2
2回答

一只名叫tom的猫

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

慕姐8265434

这发生在尝试同时访问数据库的情况下,无论是来自多个进程还是来自单个进程。该文件xd.lck包含有关数据库锁所有者的人类可读信息。
随时随地看视频慕课网APP

相关分类

Java
我要回答