2012-01-04 10 views
13

私はクライアント側からの各要求がサーバー側で複数のスレッドを生成するシステムを構築しています。各スレッドは、1つ以上のDAOを使用しています(DAOは、その時点で複数のスレッドが使用できます)。すべてのDAOはSpringのスレッドクラスに(@Autowired)注入されます。各DAOにはSessionFactoryも注入されます。Spring +複数のスレッド間でのセッション管理の休止

これらの複数のDAO間でHibernateセッションを管理する適切な方法は何ですか?マルチスレッド環境(異なるスレッドのDAOはほとんど同じセッションを同時に使用しようとしているなど)のために問題に陥ることはありません。

私はhibernate.current_session_context_class=threadをHibernate設定で指定し、DAOで毎回SessionFactory.getCurrentSession()を使用するだけで十分ですか?必要に応じてスレッドごとにセッションを正しく検出して作成できますか?

答えて

15

はい。それで十分です。

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

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

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

この結果、同じトランザクションコード内の異なるDAOメソッドで同じセッションを使用することができ、単にSessionFactory.getCurrentSession()を呼び出すだけです。これは、同じトランザクションコードで多くの異なるDAOメソッドを呼び出さなければならない場合に、DAOメソッドの入力パラメータでHibernateセッションを渡すことを防ぎます。

+3

作業が終了したらセッションを終了すると自動的に完了しますか? – MounirReg

+1

Spring 3以降でHibernateを使用するときは、SpringがHibernateセッションを管理するために必要なこの独自の実装を持っているので、このプロパティの設定は避けてください。 http://stackoverflow.com/a/18842593/3826713 – UCJava

関連する問題