私のアプリケーションでは、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 が複数回呼び出されたときに、たまに発生するだけです。
セッションがスレッドセーフではないことは知っていますが、これがそれに関連しているかどうかはわかりません。
任意のアイデアをいただければ幸いです、どうもありがとうございました!