java - jetbrains.出埃及记.ExodusException : Can't acquire environment lock after 0 ms

标签 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 方法,因此服务器的多个并发客户端调用此方法。

最佳答案

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

关于java - jetbrains.出埃及记.ExodusException : Can't acquire environment lock after 0 ms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51811780/

相关文章:

java - 对 Xodus 的非独占读取权限

java - 批量删除具有给定属性(或多个属性)的所有实体

java - 更新折线图中的值

java - 将 mongo 实体保存到不同的集合中

java - ElasticSearch 在索引之前在 JSON 中添加字段

java - 有没有办法在 Xodus 中将属性改为 "get"而不是 "finding"?

xodus - 如何使用 Xodus 以编程方式将事务刷新到磁盘?

java - 过滤 getAll 查询结果

java - 使用 Javafx 时如何关闭 CSS 日志记录?

java - Google 登录按钮 setScopes() 已弃用