web-dev-qa-db-ja.com

Hibernate openSession()vs getCurrentSession()

JSP WebアプリケーションでのHibernateの使用についていくつか質問があります。

  1. hibernate.current_session_context_classの値は何ですか?

  2. 次に、次の文のどれを使用する必要がありますか?なぜ?

     Session s = HibernateUtil.getSessionFactory().openSession();
     Session s = HibernateUtil.getSessionFactory().getCurrentSession()
    
  3. 最後に、「Webアプリごとに1セッション」と「リクエストごとに1セッション」のどちらが適切ですか?

125
wannik

このフォーラムで説明されているように post 、1と2は関連しています。 hibernate.current_session_context_classをthreadに設定してから、セッションを開くサーブレットフィルターのようなものを実装すると、SessionFactory.getCurrentSession()を使用して他のどこからでもそのセッションにアクセスできます。

SessionFactory.openSession()は常に、新しいセッションを開きます。操作が完了したら、閉じる必要があります。 SessionFactory.getCurrentSession()は、コンテキストにバインドされたセッションを返します-これを閉じる必要はありません。

SpringまたはEJBを使用してトランザクションを管理している場合、トランザクションとともにセッションを開いたり閉じたりするように設定できます。

one session per web appは使用しないでください。セッションはスレッドセーフオブジェクトではありません。複数のスレッドで共有することはできません。常に「リクエストごとに1セッション」または「トランザクションごとに1セッション」を使用する必要があります

135
gkamal

SessionFactory.openSession()について話す場合

  • 常に新しいSessionオブジェクトを作成します。
  • セッションオブジェクトを明示的にフラッシュして閉じる必要があります。
  • シングルスレッド環境では、getCurrentSession()よりも低速です。
  • このメソッドを呼び出すためにプロパティを構成する必要はありません。

SessionFactory.getCurrentSession()について話す場合

  • 存在しない場合は新しいセッションを作成し、存在しない場合は現在の休止状態のコンテキストにある同じセッションを使用します。
  • セッションオブジェクトをフラッシュして閉じる必要はありません。Hibernateによって内部的に自動的に処理されます。
  • シングルスレッド環境では、openSession()よりも高速です。
  • 追加のプロパティを設定する必要があります。 「hibernate.current_session_context_class」を使用してgetCurrentSession()メソッドを呼び出すと、例外がスローされます。
28
Ramu Agrawal

openSessionSessionFactory.openSessionを呼び出すと、常に新しいSessionオブジェクトが作成され、提供されます。

これらのセッションオブジェクトを明示的にフラッシュして閉じる必要があります。

セッションオブジェクトはnotスレッドセーフなので、マルチスレッド環境ではリクエストごとに1つのセッションオブジェクトを作成し、Webアプリケーションでもリクエストごとに1つのセッションを作成する必要があります。

getCurrentSessionSessionFactory.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>
5
Neeraj Gahlawat