インスタンスを含む計算では@Entity
、1つのスレッドAが新しいスレッドBを作成します。スレッドAはエンティティへの参照を保持し、この参照をスレッドBに渡します。
スレッドAは、単一のHTTPリクエストの処理、リポジトリ内のエンティティの検索、およびHTTPレスポンスの送信を処理します。
スレッドBは、そのエンティティに関連する長時間実行される計算を処理します。
Q:なぜ2つのスレッドを選択したのですか?A:長時間実行されるHTTP要求/応答サイクルは必要ありません。代わりに、ユーザーに「計算が開始されました」とすばやく応答する高速HTTP要求/応答サイクルが必要です。
スレッドAからエンティティにアクセスすることは問題なく機能します。
ただし、スレッドBからエンティティにアクセスすることはできません。エンティティ関係(Hibernateからデータを遅延フェッチする必要があります)にアクセスしようとすると、例外が発生しますorg.hibernate.LazyInitializationException: could not initialize proxy - no Session
。
JPA / Hibernateセッションのスコープは単一のスレッド(つまり、そのセッションを作成するスレッド(私の場合はスレッドA、これはエンティティのリポジトリをクエリするスレッド))ですか?この場合、複数のスレッドから同じエンティティを操作できるように、複数のスレッドにHibernateセッションを共有させるにはどうすればよいですか?
私のエンティティの反発動作を「積極的な読み込み」に変更することは、実行可能な解決策ではありません。PersistenceContext
また、ドメインクラス/エンティティに影響を与えないソリューションを探しています(たとえば、ドメインクラス内またはEntityManager
ドメインクラス内でデタッチされたエンティティを再接続したくない場合などです。