26

データベーストランザクションの概念の一般的な理解を理解しています。トランザクション内のデータベースにアクセスして、ACIDプロパティを確認します。

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

詳細を説明するために、私は休止状態のコードを見てきました

  • セッションファクトリからセッションを取得します
  • セッションを開きます
  • トランザクションを開始します
  • トランザクションをコミットします
  • セッションを閉じます

私が知る必要があるのは、ここでのセッションの重要性は何ですか?トランザクションファクトリのようなものを持って、トランザクションを開始し、トランザクションをコミットしてみませんか?

4

2 に答える 2

22

セッションは単なるトランザクションではなく、UnitOfWorkパターンの実装です。言い換えれば、ロードされたオブジェクトを保持し、永続化する必要があるオブジェクトを認識します。

作業単位は、ビジネス トランザクション中にデータベースに影響を与える可能性のあるすべての操作を追跡します。完了すると、作業の結果としてデータベースを変更するために実行する必要があるすべてのことを把握します。

セッションとトランザクションの関係をよりよく理解するには、この記事をご覧ください。

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

これは、リクエストごとのセッションの実装パターンに使用される最も一般的なプログラミング モデルです。単一のセッションと単一のデータベース トランザクションは、特定の要求イベント (Web アプリケーションの Http 要求など) の処理を​​実装します。session-per-operation アンチパターンは絶対に使用しないでください。(操作ごとのセッションが適切な場合は非常にまれな例外があります。Hibernate を学んでいるだけであれば、これらに遭遇することはありません。)

別のプログラミング モデルは、長い会話のモデルです。たとえば、複数の要求/応答サイクルでユーザーとやり取りするために、ウィザード ダイアログなどのマルチステップ ダイアログを実装するアプリケーションです。これを実装する 1 つの方法は、session-per-request-with-detached-objects パターンです。永続オブジェクトは、ユーザーの思考時間中に切り離されたと見なされ、変更後に新しいセッションに再接続する必要があります。

ただし、会話ごとのセッション パターンをお勧めします。この場合、単一のセッションのスコープは単一のデータベース トランザクションよりも大きく、複数のデータベース トランザクションにまたがることがあります。各要求イベントは単一のデータベース トランザクションで処理されますが、会話をアトミックにするために、セッションのフラッシュは会話の最後と最後のデータベース トランザクションまで遅延されます。ユーザーの思考時間中、セッションは切断された状態で保持され、データベース接続は開かれません。Hibernate の自動楽観的同時実行制御 (バージョン管理を使用) を使用して、会話の分離を提供します。

于 2012-05-09T18:30:37.933 に答える
7

@Dmitryは非常にうまく答えました。

セッションを調べるもう 1 つの方法は、データベース使用のインスタンスです。セッションを作成すると、必要なサポート サービス (トランザクション、キャッシング、接続など) とのデータベース インタラクションの準備が整ったコンテキストが作成されます。トランザクションは、セッション内で使用される独立したサービスです。

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

于 2012-05-09T19:00:10.630 に答える