xybrek:
(私たちは、原因が何であるかを知らない)私たちは、サーブレットコンテナに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
メソッドは、サーブレットのエンドポイントから呼び出され、サーバーのように、複数の同時クライアントは、このメソッドを呼び出します。
ヴャチェスラフLukianov:
ところで、それはそれぞれのリクエストに応じて、オープン/クローズ環境に非常に非効率的です。それは彼らが更新されながら、オープンな環境を保つために理にかなっています。オープン環境の数を制限するには、おそらくそれは、オープンな環境のキャッシュを持っているし、キャッシュから押し出されたものを閉じて良いことです。