jetbrains.exodus.ExodusException: 0 毫秒后无法获取环境锁
jetbrains.exodus.ExodusException: Can't acquire environment lock after 0 ms
我们在 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
方法,因此服务器的多个并发客户端调用此方法。
这种情况发生在试图同时访问数据库的情况下,无论是从多个进程还是从单个进程。文件 xd.lck
包含有关数据库锁所有者的人类可读信息。
顺便说一句,open/close Environment 在每个请求上的效率非常低。在更新环境时保持环境开放是有意义的。为了限制开放环境的数量,最好有一个开放环境的缓存并关闭那些从缓存中推出的环境。
我们在 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
方法,因此服务器的多个并发客户端调用此方法。
这种情况发生在试图同时访问数据库的情况下,无论是从多个进程还是从单个进程。文件 xd.lck
包含有关数据库锁所有者的人类可读信息。
顺便说一句,open/close Environment 在每个请求上的效率非常低。在更新环境时保持环境开放是有意义的。为了限制开放环境的数量,最好有一个开放环境的缓存并关闭那些从缓存中推出的环境。