1

セットアップに関するいくつかの事実:

  • これはTomcatベースのアプリです(問題はTomcatのコンテキスト外でも発生しますが-JUNIT)
  • スプリングを使用しない
  • すべてのスレッドには独自の Hibernate がありSessionます (TLS で)
  • オブジェクトは混在した方法で保存/ロードされています。つまり、スレッド AObjAによって作成され、後でスレッド 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ますが、それはそう聞こえます... ブロック (スレッド単位)。

この種の問題はずっと前に解決されたと確信しています。それを見つける必要があるだけです(車輪を再発明することなく)。

4

2 に答える 2

1

オブジェクトは Hibernate セッションにアタッチされています。はい。一度に 1 つずつしか接続できません。はい。Hibernate セッションを閉じない限りevict()、オブジェクトを試してセッションから切り離し、別のスレッドでロードできるようにすることができます。問題は、プログラムの流れによっては、これが実用的でない可能性があることです。

于 2012-06-28T06:19:52.857 に答える
0

clear()オブジェクトをフェッチする前に呼び出す。

于 2012-08-16T18:55:44.457 に答える