私のアプリケーションでは、Java、Hibernate(Annotations)とmySQLを使用しています。ほとんどの場合正常に動作していますが、このエラーが発生することがあります。
SEVERE: Could not synchronize database state with session
org.hibernate.exception.LockAcquisitionException: could not update: [myPack.Analysis$TestRun#5191]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.Java:107)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.Java:66)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.Java:2596)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.Java:2478)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.Java:2805)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.Java:114)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.Java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.Java:260)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.Java:180)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.Java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.Java:51)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.Java:1206)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.Java:375)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.Java:137)
at myPack.Analysis.fileHelper(Analysis.Java:977)
at myPack.Analysis.dirHelper(Analysis.Java:702)
at myPack.Analysis.dirHelper(Analysis.Java:714)
at myPack.Analysis.dirHelper(Analysis.Java:714)
at myPack.Analysis.dirHelper(Analysis.Java:714)
at myPack.Analysis.dirHelper(Analysis.Java:714)
at myPack.Analysis.dirHelper(Analysis.Java:711)
at myPack.Analysis.parseLog(Analysis.Java:682)
at myPack.Analysis.main(Analysis.Java:614)
Analysis.Java
で最も疑わしい行は次のとおりです。
dbPerson = (Person) session.get(Person.class, dbPersonId, LockOptions.READ);
私がしたことは、dbPersonId
で行を取得し、必要に応じて行の内容を更新/変更することです。例えば:
dbPerson.Name = "Jack";
dbPerson.Age ++;
session.saveOrUpdate(dbPerson);
LockOptions
に何か問題があると推測し、NONE, UPGRADE
...などのさまざまなロックオプションを使用してみましたが、それでもうまくいきません。
最もイライラするのは、このエラーを手動で再現することすらできないことです。 Analysis.Javaが複数回呼び出された場合にのみ発生します。
セッションがスレッドセーフではないことは知っていますが、これがそれに関連しているかどうかはわかりません。
どんなアイデアでもよろしくお願いします、ありがとうございます!
READ
ロックオプションを使用しているので、例外をキャッチし、スレッドをしばらくスリープさせてから、ロックの取得を再試行します。これにより、問題が解決します。
try {
dbPerson = (Person) session.get(Person.class, dbPersonId, LockOptions.READ);
} catch (RuntimeException e) {
if (e instanceof LockAcquisitionException) {
try {
Thread.sleep(15000);
dbPerson = (Person) session.get(Person.class, dbPersonId, LockOptions.READ);
} else {
throw e;
}