2012-05-09 18 views
21

私はデータベーストランザクションの概念の一般的な理解を理解します。 ACIDプロパティを保証するために、トランザクション内のデータベースにアクセスします。データベースセッションとは何ですか?

Hibernateにはセッションと呼ばれる概念があります。セッションの使用は何ですか?データベースへのアクセスは、同じセッションではなく2つのセッションでいつ行う必要がありますか?

以上を説明するために、私は

  • はセッションファクトリ
  • からセッションを取得することを休止コードがセッション
  • がトランザクション
  • が閉じコミットトランザクションを開始開きます見てきましたセッション

必要なものここでセッションの重要性は何ですか?なぜトランザクションファクトリー、トランザクション開始、トランザクションコミットのようなものを持っていないのでしょうか?

+1

「データベースへのアクセスは、同じセッションではなく2つのセッションで行う必要がありますか?」 https://developer.atlassian.com/display/CONFDEV/Hibernate+Sessions+and+Transaction+Management+Guidelines –

+0

FYI - ウィキペディアのページがあります:http://en.wikipedia.org/wiki/Session_(computer_science) –

答えて

18

セッションは単なるトランザクション以上のもので、UnitOfWorkパターンの実装です。言い換えれば、ロードされたオブジェクトを保持し、どのオブジェクトを永続化しなければならないかを知ります。

作業ユニットは、データベースに影響を与えるビジネストランザクション中に行うすべての作業を追跡します。作業が完了すると、作業の結果としてデータベースを変更するために必要な作業がすべて把握されます。

セッションとトランザクションの関係を理解するために、this articleをご覧ください。

単一のHibernateセッションは、単一のデータベーストランザクションと同じスコープを持つ可能性があります。

これは、リクエストごとのセッションの実装パターンに使用される最も一般的なプログラミングモデルです。単一のセッションと単一のデータベーストランザクションは、特定のリクエストイベント(たとえば、WebアプリケーションのHttpリクエスト)の処理を実装します。セッションごとの反パターンを決して使用しないでください! (セッションあたりのセッションが適切な場合は非常にまれな例外がありますが、Hibernateを学習しているだけであれば、これに遭遇することはありません)。別のプログラミングモデルは長い会話のモデルです。いくつかの要求/応答サイクルでユーザーとやりとりするためのウィザードダイアログなどの複数ステップのダイアログを実装するアプリケーションです。 これを実装する1つの方法は、session-per-request-with-detached-objectsパターンです。永続オブジェクトは、ユーザーの思考の間に切り離されたとみなされ、変更後に新しいセッションに再接続する必要があります。

ただし、会話ごとのパターンが推奨されます。この場合、1つのセッションは1つのデータベーストランザクションよりも大きなスコープを持ち、複数のデータベーストランザクションにまたがる可能性があります。各リクエストイベントは単一のデータベーストランザクションで処理されますが、セッションのフラッシングは会話が終了するまで遅延され、最後のデータベーストランザクションによって会話がアトミックになります。セッションは、ユーザーの思考時間中、データベース接続が開いていない切断状態で保持されます。 Hibernateの自動オプティミスティック同時実行制御(バージョン管理付き)は、会話の分離を提供するために使用されます。

5

@ドミトリーは非常にうまく答えています。

セッションを見るもう1つの方法は、データベース使用のインスタンスです。セッションを作成するときには、サポートサービス(トランザクション、キャッシング、接続など)とのデータベースのやりとりが可能なコンテキストが用意されています。トランザクションは、セッション内で使用される独立したサービスです。

また、セッションは、hibernateなどの一般的なORマッピングツールで使用される第1レベルのキャッシュです。セッションは、DBのやりとりを容易にするために要求に応じて作成される一時的なコンテキストとして機能します

関連する問題