レコードが既に作成されているかどうかわからない場合、マルチスレッド アプリケーションで Hibernate を使用してどのように管理しますか。
Thread 1
Create Session
Do some Stuff
Create DatabaseObject
Do some more stuff
Close Session
Thread 1
Create Session
Do some Stuff
Create DatabaseObject
Do some more stuff
Commit Session
私の問題は、Thread1 が多数の休止状態の呼び出しを行う可能性があり、同時に Thread2 が同じオブジェクトを更新/作成しようとする可能性があることです。これをキャッチしてStaleObjectExceptionをキャッチすれば対応できると思ったのですが、トランザクションをコミットするまで例外が発生しないのが難点です。これはメソッドの最後まで発生しないため、1 か所で発生する可能性のあるすべてのケースを処理するのは非常に困難です。
別の方法として、1 つのスレッド内で複数のセッションを使用することもできますが、既存のセッションの実行時間はそれほど長くなく、複数のセッションに分割することは Hibernate のアンチパターンであると確信しています。または、原因となる可能性のあるコードの周りにいくつかのロックを追加することもできますが、もう一度複数のセッションに侵入する必要があると思います
これを行う通常の方法は何ですか?
より具体的な例を挙げると、Thread1 と Thread2 は両方とも同じことを行い、ファイルを処理し、その間に画像ファイル (.jpg、.png など) をデータベースに追加します。画像の表現はデータのチェックサムに基づいているため、 2 つのファイルに同じ画像データが含まれている場合、画像ファイルは 1 回だけ追加する必要があります。どちらも、データベースに追加する前に一致するデータキーを持つイメージの存在をチェックしますが、チェックしてから一致を見つけるまでの中間期間に、イメージを作成すると、例外が発生する可能性があります。