Hibernateのドキュメントによると、それorg.hibernate.Session
はシングルスレッドの作業単位を表します。作業単位が DB トランザクションのコンテキストで使用されることを理解しています。シングルスレッドとはどういう意味ですか? これを理解するのを手伝ってください。
2 に答える
これは、Session クラスがそれを可能にするように設計されていないため、複数のスレッドから同じ Session インスタンスを使用できないことを意味します。したがって、1 つのスレッドでセッションを開く場合、このスレッドだけがセッションと、このセッションから取得したエンティティを使用する必要があります。
セッション JavaDoc から:
実装者がスレッドセーフであることは意図されていません。代わりに、各スレッド/トランザクションは、SessionFactory から独自のインスタンスを取得する必要があります。
Hibernate セッションは、高度にステートフルな複雑なオブジェクトです (オブジェクトをキャッシュし、内部表現を DB と同期するなど)。これは、異なるスレッド間でセッションを共有する場合、2 つのスレッドが同時にメソッドを呼び出し、セッションの内部状態を台無しにしてバグを引き起こす可能性があるという警告です。
Hibernate には、2 つのスレッドがアクセスしていることを「検出」する方法がなく、例外がスローされない場合があります。それはそれのために設計されていません。
スレッド セーフに関する Wiki リンク: http://en.wikipedia.org/wiki/Thread_safety。
単一のスレッドで実行されるプログラムは単純です。すべてが順次実行されるため、動作は非常に予測可能です。
OTOH、2 つ以上のスレッドがある場合、予期しない方法で相互に対話できます。
例えば:
public class NotThreadSafe {
public int internal = 0;
public void update() {
for (internal = 0; internal < 100; internal++) {
System.out.println(internal);
}
}
}
このクラスの 1 つのインスタンスが 2 つのスレッドで共有されているとします。最初のものはメソッドを呼び出し、update
反復を開始します。これが行われている間、2 番目のスレッドもupdate
メソッドを呼び出します。これは最初のものをリセットする効果がありinternal
、それらは互いに衝突することになります.