JSP WebアプリケーションでのHibernateの使用についていくつか質問があります。
hibernate.current_session_context_class
の値は何ですか?
次に、次の文のどれを使用する必要がありますか?なぜ?
Session s = HibernateUtil.getSessionFactory().openSession();
Session s = HibernateUtil.getSessionFactory().getCurrentSession()
最後に、「Webアプリごとに1セッション」と「リクエストごとに1セッション」のどちらが適切ですか?
このフォーラムで説明されているように post 、1と2は関連しています。 hibernate.current_session_context_class
をthreadに設定してから、セッションを開くサーブレットフィルターのようなものを実装すると、SessionFactory.getCurrentSession()
を使用して他のどこからでもそのセッションにアクセスできます。
SessionFactory.openSession()
は常に、新しいセッションを開きます。操作が完了したら、閉じる必要があります。 SessionFactory.getCurrentSession()
は、コンテキストにバインドされたセッションを返します-これを閉じる必要はありません。
SpringまたはEJBを使用してトランザクションを管理している場合、トランザクションとともにセッションを開いたり閉じたりするように設定できます。
one session per web app
は使用しないでください。セッションはスレッドセーフオブジェクトではありません。複数のスレッドで共有することはできません。常に「リクエストごとに1セッション」または「トランザクションごとに1セッション」を使用する必要があります
SessionFactory.openSession()について話す場合
SessionFactory.getCurrentSession()について話す場合
openSession
:SessionFactory.openSession
を呼び出すと、常に新しいSession
オブジェクトが作成され、提供されます。
これらのセッションオブジェクトを明示的にフラッシュして閉じる必要があります。
セッションオブジェクトはnotスレッドセーフなので、マルチスレッド環境ではリクエストごとに1つのセッションオブジェクトを作成し、Webアプリケーションでもリクエストごとに1つのセッションを作成する必要があります。
getCurrentSession
:SessionFactory.getCurrentSession
を呼び出すと、hibernateコンテキストにあり、内部でhibernateによって管理されるセッションオブジェクトが提供されます。トランザクションスコープにバインドされています。
SessionFactory.getCurrentSession
を呼び出すと、存在しない場合は新しいSession
を作成します。存在しない場合は、現在の休止状態のコンテキストにある同じセッションを使用します。トランザクションが終了するとセッションを自動的にフラッシュして閉じますので、外部で行う必要はありません。
シングルスレッド環境でhibernateを使用している場合は、毎回新しいセッションを作成するよりもパフォーマンスが速いため、getCurrentSession
を使用できます。
getCurrentSession
メソッドを使用するには、次のプロパティをhibernate.cfg.xmlに追加する必要があります。
<session-factory>
<!-- Put other elements here -->
<property name="hibernate.current_session_context_class">
thread
</property>
</session-factory>