14

クライアント側からの各リクエストがサーバー側で複数のスレッドを生成するシステムを構築しています。各スレッドは、1 つ以上の DAO を使用します (一部の DAO は、同時に複数のスレッドで使用できます)。すべての DAO は@Autowired、Spring によってスレッド クラスに注入 () されます。各 DAOSessionFactoryも注入されます。

これらの複数の DAO 間で Hibernate セッションを管理する適切な方法は何でしょうか。マルチスレッド環境のために問題が発生しないようにするためです (たとえば、異なるスレッドのいくつかの DAO が同時に同じセッションを使用しようとしているなど)。

Hibernate構成で指定hibernate.current_session_context_class=threadし、DAOで毎回単純SessionFactory.getCurrentSession()に作業を行うだけで十分でしょうか? 必要に応じて、スレッドごとにセッションを適切に検出して作成しますか?

4

1 に答える 1

15

はい。十分です。

に設定hibernate.current_session_context_classするthreadと、から返されるセッションはインスタンスSessionFactory.getCurrentSession()からのものです。ThreadLocal

すべてのスレッドには独自の独立したThreadLocalインスタンスがあるため、異なるスレッドが同じ休止状態のセッションにアクセスすることはありません。

の動作は次のSessionFactory.getCurrentSession()とおりです。現在のスレッドで初めて呼び出された場合、新しいセッションが開かれ、返されます。同じスレッドで再度呼び出されると、同じセッションが返されます。

その結果、を呼び出すだけで、同じトランザクションコード内の異なるDAOメソッドで使用する同じセッションを取得できますSessionFactory.getCurrentSession()。同じトランザクションコードで多くの異なるDAOメソッドを呼び出す必要がある場合に、DAOメソッドの入力パラメーターを介してHibernateセッションを渡すことができなくなります。

于 2012-01-04T08:10:21.370 に答える