セットアップに関するいくつかの事実:
- これはTomcatベースのアプリです(問題はTomcatのコンテキスト外でも発生しますが-JUNIT)
- スプリングを使用しない
- すべてのスレッドには独自の Hibernate があり
Session
ます (TLS で) - オブジェクトは混在した方法で保存/ロードされています。つまり、スレッド A
ObjA
によって作成され、後でスレッド B によって操作され、さらに後でスレッド A によって更新され、スレッド Z によって再び操作される可能性がありますが、今回は HQL を使用しています。
上記のセットアップを行うと、次のようなエラーが発生します。
org.hibernate.HibernateException: illegally attempted to associate a proxy with two open Sessions
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
私の理解は、
- これはすべて Hibernate の
Session
に関連しており、セッションはそれに「接続」されたオブジェクト (作成/ロードされたもの) を「所有」します。 - そしておそらくキャッシングの問題
問題は明らかです:
- コアの問題 (上記) を理解していますか?
- このような問題を回避するにはどうすればよいですか?
- これらの問題を回避するのに役立つ経験則はありますか?
- Spring を使用すると解決に役立ちますか (少し具体的に説明してください)。
Session
データストアからフェッチした後にすべてのオブジェクトから切り離し、Session
更新する直前に後でオブジェクトにアタッチするのは、それを処理する理想的な方法でしょうか?
もちろん、オブジェクトを 1 つだけ使用する場合は、すべてを回避できSession
ますが、それはそう聞こえます... ブロック (スレッド単位)。
この種の問題はずっと前に解決されたと確信しています。それを見つける必要があるだけです(車輪を再発明することなく)。