2012-01-04 13 views
15

SpringでのHibernateセッションの "lifecycle"を正しく行う方法は?Spring + Hibernateセッションライフサイクル

SessionFactoryはSpringによって自動的に作成され、Glassfish接続プールからDB接続を取得しています。現時点では、私はSessionFactory.getCurrentSession()でHibernateセッションを取得しています。その後、私はトランザクションを開始し、仕事をし、最後にcommit()またはrollback()をします。 disconnect()close()flush()などの他のアクションをいつでも実行する必要がありますか。接続がプールに正しく返されるようにするか、既にSpringによって自動的に行われているすべての処理ですか?

これらの方法がたくさんありますが、いつ何をすべきかを理解するために、今私はちょっと混乱しています。誰かが正しい方向を指しているかもしれません。

答えて

12

SessionFactoryはSpringによって自動的に作成されるため、Springフレームワークは接続を終了します。 チェックアウトSpring Resource Management

チェックしたい場合。あなたのアプリケーションのログを使用している場合は、ログを確認することができます。私はここでの主な契約はセッションインスタンスの作成ですthis link

から次の行を取得する(メイン)INFO [AnnotationSessionFactoryBean]にHibernateのSessionFactory

を閉じる

:それは次のようになります。通常 アプリケーションには1つのSessionFactoryインスタンスがあり、スレッドに サービスを提供するスレッドは、このファクトリからSessionインスタンスを取得します。 SessionFactoryの内部状態は不変です。 が作成されると、この内部状態が設定されます。この内部状態には、オブジェクト/リレーショナル・マッピングに関するすべての のメタデータが含まれます。 実装者はスレッドセーフでなければなりません。

+0

私のシステムではSessionFactoryがシングルトンBeanとして設定されているため、決して閉じることはありません。 – Laimoncijus

+0

@Laimoncijus:SessionFactoryはデフォルトではシングルトンです。回答はそれに従って修正されました。それを確認してください –

+0

だから、あなたはsessionfactoryシングルトンを設定する必要はありません。また、この回答を確認してください:http://stackoverflow.com/questions/8523332/close-opened-hibernation-sessions-if-exist/8530891#8530891 –

2

希望リンクはセッションと取引についてご案内します。

次に、トランザクションを開始し、作業を行い、最後にコミット()またはロールバック() を実行します。私はdisconnect()、 close()、flush()、またはいつでも他のアクションを行う必要がありますか? はプールに戻って正しく返されるか、すでにすべてが で自動的に行われますか?

トランザクションでcommit()を呼び出すと、自動的にセッションが閉じられ、最終的に接続時にcloseメソッドがコールされてプールに戻ります。

3

SessionFactory.getCurrentSession()で休止状態のクエリを実行しているとき、Springは接続のオープンとクローズに必要なタスクを実行します。 Springコンフィグレーションで使用しているSessionFactoryもconfig.buildSessionFactoryメソッドを内部的に呼び出します。

このほとんどは、AbstractSessionFactoryBeanの実装で発生します。接続の終了は、settings.getConnectionProvider()。close();ステートメントを使用してSessionFactoryImplクラスのhibernateによって行われます。 。要するに、休止状態はあなたのためにすべてを行います。Springは、必要なときにヘルプを呼び出すだけです。バック接続プールへの接続のリリースは春.ITとは何の関係もない方法について

6

ポリシーはからorg.hibernate.ConnectionReleaseMode

スタートに列挙によって識別された設定パラメータhibernate.connection.release_modeを通じて休止状態自体で構成されていますバージョン3.1以降では、hibernate.connection.release_modeのデフォルト値はであり、対応するConnectionReleaseModeの値はJTAトランザクションかJDBCトランザクションかによって異なります。 JDBCトランザクションを使用する場合、ConnectionReleaseMode.AFTER_TRANSACTION(つまりafter_transaction)に設定されます。

ConnectionReleaseMode.AFTER_TRANSACTIONの振る舞いがあることである:接続はそれがtransaction.commit()またはtransaction.rollback()のいずれかを呼び出すだけでなく、session.close()session.disconnect()

を呼び出すことであるあなたは、この動作を確認することができ、各トランザクションの後に接続プールに返されますhibernate documentation Section 11.5

関連する問題