Hibernate スナップショット テクノロジ

「 Hibernate レベル 1 キャッシュの詳細な説明」の学習を通じて 、読者は すでにHibernateのレベル 1 キャッシュについて ある程度の理解を持っています。1 次キャッシュ内のデータとデータベース内のデータの一貫性を確保するために、Hibernate フレームワークにはスナップショット テクノロジが提供されています。

Hibernate がデータを 1 次キャッシュに保存するとき、データのコピーもコピーされ、Hibernate スナップショットに保存されます。commit() メソッドが呼び出されると、一次キャッシュ内のデータ操作がクリーンアップされます) と同時に、一次キャッシュ内のデータが 1 次キャッシュ内のデータと同じであるかどうかがチェックされます。スナップショット領域。異なる場合は、update() メソッドが実行され、一次キャッシュ内のデータとデータベースが同期され、スナップショット領域が更新されますが、異なる場合は、update() メソッドは実行されません。

以下では、特定の例を通じて Hibernate スナップショット テクノロジの適用を示します。次のコードを使用して、test3() というメソッドを GoodsTest に追加します。

// Hibernate スナップショット
@Test 
public void test3() { 
    Session session = HibernateUtils.getSession(); // セッション オブジェクトを取得
    session.beginTransaction(); 
    Goods Goods = new Goods(); 
    Goods.setName("pen"); 
    Goods .setPrice(5.0); 
    session.save(goods); // セッション オブジェクトを保存します
    Goods.setPrice(4.5); // 価格を送信
    session.getTransaction().commit(); // トランザクションを送信
    session .close (); // リソースを閉じる
}

上記のコードでは、 Goods オブジェクトが作成され、オブジェクトのプロパティに値が割り当てられます。save() メソッドが実行されると、データは 1 次キャッシュに保存されます。次に、オブジェクトの価格属性値を変更し、トランザクションを送信して、セッション オブジェクトを閉じます。

JUnit テストを使用して test3() メソッドを実行した後のコンソール表示結果を図 1 に示します。
 

出力結果


図1 出力結果


図 1 の表示結果から、上記の test3() メソッドが実行されると、合計 2 つの SQL ステートメントが発行されることがわかります。デバッグ モードを使用して実行プログラムをデバッグすると、最初の insert ステートメントは save() メソッドの実行後に発行され、2 番目の update ステートメントはトランザクションがコミットされるまで発行されないことがわかります。

この時点で、読者はなぜ更新ステートメントが発行されるのか困惑しているはずです。

これは、セッションの save() メソッドが実行されると、Goods オブジェクトのデータが Hibernate の 1 次キャッシュに保存され、データのコピーが Hibernate スナップショットに入れられるためです。実行されると、Hibernate はスナップショット内のデータを検出します。スナップショット内のデータが一次キャッシュ内のデータと一致しているかどうかは、Goods オブジェクトの価格属性の値がその前に変更されているため、スナップショット内のデータは1 次キャッシュ内のデータと矛盾するため、1 次キャッシュ内の Hibernate データを更新するために更新ステートメントが送信されます。

この時点での商品テーブルのデータは図 2 に示されています。

データクエリの結果


図 2 データ クエリの結果


図 2 のクエリ結果からわかるように、グッズ テーブルに挿入されたデータは、一次キャッシュ内の更新されたデータです。

おすすめ

転載: blog.csdn.net/unbelievevc/article/details/132201593