「 Hibernate L2 Cache Concurrent Access Strategies and Common Plug-ins 」チュートリアルで紹介したいくつかの一般的に使用される 2 次キャッシュ プラグインの中で、EHCache キャッシュ プラグインは理想的なプロセス全体のキャッシュ プラグインです。このセクションでは、EHCache キャッシュ プラグインを例として、2 次キャッシュの構成と使用法を紹介します。このセクションは、チュートリアルの前のセクションの例に基づいて統合されており、具体的な手順は次のとおりです。
1. EHCache関連のJARパッケージをインポートする
読者は、公式 Web サイト http://www.ehcache.org/downloads/から EHCache の JAR パッケージをダウンロードできます 。アクセスに成功した後のページを図 1 に示します。
図 1 EHCache のダウンロード
図 1 からわかるように、EHCache の最新バージョンは ehcache-3.7 です。このチュートリアルでは ehcache-2.10.5 を使用します。このバージョンの EHCache をダウンロードするには、図の Ehcache 2.x の下のリンクをクリックしてください。ダウンロードして解凍した後、圧縮ファイル内で ehcache-2.10.5.jar を見つけ、それを hibernateDemo05 プロジェクトの lib ディレクトリにコピーし、クラスパスに公開します。
2. EHCacheの設定ファイルehcache.xmlをインポートします。
ehcache.xml は、Hibernate解凍パッケージの hibernate-distribution-3.6.10.Final\project\etc ディレクトリから直接 見つけることができ、見つけたら、このファイルをプロジェクトの src ディレクトリにコピーします。ehcache.xml ファイルの主なコードは次のとおりです。
<?xml version="1.0"coding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache .org/ehcache.xsd" updateCheck="false"> <diskStore path="java.io.tmpdir/Tmp_EhCache" /> <defaultCache essential="false" maxElementsInMemory="10000" overflowToDisk="false" discPersistent="false" timeToIdleSeconds="1800" timeToLiveSeconds="259200" memoryStoreEvictionPolicy="LRU" /> <キャッシュ名="クラウド_ユーザー" 永遠 = false" maxElementsInMemory = "5000" overflowToDisk = "false" discPersistent="false" timeToIdleSeconds="1800" timeToLiveSeconds="1800" memoryStoreEvictionPolicy="LRU" /> </ehcache>
上記の設定コードにおける各要素の機能を次の表に示します。
名前 | 説明する |
---|---|
<diskStore> 要素 | キャッシュされたデータ ファイルの保存ディレクトリを設定するために使用されます。 |
<defaultCache> 要素 | キャッシュのデフォルトのデータ有効期限ポリシーを設定するために使用されます。 |
<cache> 要素 | これは、特定の名前付きキャッシュのデータ有効期限ポリシーを設定するために使用されます。 |
maxElementsInMemory プロパティ | キャッシュされるオブジェクトの最大数を設定するために使用されます |
永遠の財産 | これは期限切れにならないかどうかを指定するために使用されます。true は期限切れでないことを意味し、false は期限切れであることを意味します。 |
timeToIdleSeconds プロパティ | オブジェクトがアイドル状態でいられる最大秒数を設定するために使用されます。 |
timeToLiveSeconds プロパティ | オブジェクトがキャッシュされる最大秒数を設定するために使用されます。 |
overflowToDisk 属性 | メモリオーバーフロー時にオーバーフローオブジェクトをハードディスクに書き込むかどうかを設定します。 |
3. L2キャッシュを有効にする
Hibernate コア構成ファイルで 2 次キャッシュを有効にし、2 次キャッシュに保管する必要があるエンティティー・クラスを指定します。その構成コードは次のとおりです。
<property name ="hibernate.cache.use_second_level_cache">true </property> <property name ="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider </property > <mapping resource ="com/mengma/domain" /person.hbm.xml"/> <クラスキャッシュの使用法 ="読み取り-書き込み" クラス ="com.mengma.domain.Person"/>
上記の設定コードでは、hibernate.cache.use_second_level_cache を使用して 2 次キャッシュを有効にし、hibernate.cache.provider_class を使用して 2 次キャッシュのプロバイダーを指定します。
<class-cache> タグは、2 次キャッシュに格納されるデータを指定するために使用され、usage 属性は指定されたキャッシュ戦略を示します。<class-cache> タグは <mapping> タグの後ろに配置する必要があることに注意してください。
4. テストクラスを作成する
com.mengma.test パッケージの下に SecondEHChcheTest という名前のテスト クラスを作成し、そのクラスに testCache() メソッドを追加します。testCache() メソッドでは、2 つの Session オブジェクトを開いてから、get() メソッドを使用して 4 回クエリを実行し、クエリ結果を比較することで 2 次レベル キャッシュの使用状況を観察する必要があります。その実装コードは次のとおりです。
パッケージ com.mengma.test; インポート org.hibernate.Session; インポート org.hibernate.Transaction; インポート org.junit.Test; インポート com.mengma.domain.person; インポート com.mengma.utils.HibernateUtils; public class SecondEHChcheTest { @Test public void testCache() { Session session1 = HibernateUtils.getSession(); // 最初のセッション オブジェクトを開きます Transaction tx1 = session1.beginTransaction(); // 最初のトランザクションを開きます person p1 = (person) session1.get (person .class, 1); // p1 オブジェクトを取得します。 Person p2 = (person) session1.get(Person.class, 1); // p2 オブジェクトを取得します。 System.out.println(p1 == p2); // セクション 1 の比較 tx1.commit(); // トランザクションをコミットする session1.close(); // session1 オブジェクトが閉じられ、一次キャッシュがクリアされます Session session2 = HibernateUtils.getSession(); // 2 番目の Session オブジェクトを開きます Transaction tx2 = session2.beginTransaction(); // 2 番目のトランザクションを開きます Person p3 = (person) session2.get(Person.class, 1); // p3 オブジェクトの取得 System.out.println(p1 == p3); // 2 番目の比較 Person p4 = (person) session2.get(person.class, 1); // p4 オブジェクトの取得 System.out.println (p3 == p4); // 3 番目の比較 tx2.commit(); // トランザクション 2 をコミット session2.close(); // セッション 2 がクローズされました } }
5. プログラムを実行し、結果を表示します。
JUnit を使用して testCache() メソッドをテストして実行します。正常に実行された後のコンソール出力は図 2 に示されています。
図 2 testCache() メソッドのテスト結果
図 2 からわかるように、コンソールは 1 つのクエリ SQL のみを出力します。これは、Hibernate がデータベースに 1 回だけクエリを実行することを意味します。そして、次の true、false、true は 3 つの比較出力の結果です。詳しい説明は以下の通りです。
1) 上記のコードでは、2 つのセッションとトランザクションが開かれていますが、最初のセッションから p1 オブジェクトを取得する場合、一次キャッシュと二次キャッシュに対応するデータがないため、トランザクションからクエリする必要があります。データベースなので SQL 文が発行されます。
2) p1 オブジェクトがクエリされた後、p1 オブジェクトは 1 次キャッシュと 2 次キャッシュに保存されます。p2 オブジェクトを取得する場合、セッションが閉じられていないため、オブジェクトは 1 次キャッシュから取得されます。p1 オブジェクトと p2 オブジェクトは両方とも 1 次キャッシュに格納され、同じエンティティ オブジェクトをポイントしているため、最初の出力結果は true になります。
3) 次に、トランザクション tx1 を送信し、セッション 1 を閉じます。この時点で、一次キャッシュ内のデータはクリアされます。
4) 次に、2 番目のセッションとトランザクションを開いて p3 オブジェクトを取得しますが、このとき、p3 オブジェクトは 2 次キャッシュから取得されるため、コンソールは SQL ステートメントを生成しません。フェッチ後、2 次キャッシュはデータを 1 次キャッシュに同期し、p3 オブジェクトは再び 1 次キャッシュに存在します。
5) p3 オブジェクトは 2 次キャッシュから取得され、オブジェクトのバルク データは 2 次キャッシュに格納されているため、新しいオブジェクトが再作成され、2 番目の出力の結果は false になります。
6) 最終的に p4 オブジェクトを取得するとき、Person オブジェクトはすでに 1 次キャッシュに存在するため、Hibernate は 1 次キャッシュから直接取得するため、出力結果は true になります。