1。MyBatisキャッシュの紹介
ほとんどの持続層フレームワークと同様に、MyBatisはL1およびL2キャッシュのサポートも提供します。
1。レベル1キャッシュ:
PerpetualCacheに基づくHasHMAPローカルキャッシュには、セッションのストレージ範囲があります。セッションがフラッシュまたは閉じた後、セッション内のすべてのキャッシュがクリアされます。
2。レベル2キャッシュ:
セカンドレベルのキャッシュは第1レベルのキャッシュと同じであり、デフォルトは永続的なキャッシュとハッシュマップストレージです。違いは、そのストレージスコープがマッパー(名前空間)であり、ehcacheなどのストレージソースをカスタマイズできることです。
3.キャッシュデータの更新メカニズムの場合、特定のスコープ(第1レベルのキャッシュセッション/セカンドレベルのキャッシュ名空間)が実行される場合、このスコープの下の選択のすべてのキャッシュはデフォルトでクリアされます。
1.1。 MyBatisレベル1キャッシュテスト
packed me.gacl.test; import me.gacl.domain.user; import me.gacl.util.mybatisutil; import org.apache.ibatis.session.sqlsession; import org.junit.test;デフォルト)*/@testpublic void testcache(){sqlsession session = mybatisutil.getsqlsession(); string statement = "me.gacl.usermapper.getuser"; user user = session.selectone(statement、); system.out.out.println(userect) ); system.out.println(user); session.close();/*。同じセッションでなければなりません。セッションオブジェクトが閉じている場合()、それを使用することは不可能です */session = mybatisutil.getsqlsession(); user = session.selectone(statement、); system.out.println(user);/ *。クエリ条件は同じ */user = session.selectone(statement、); system.out.println(user);/ *です。 CACHE*/// SESSION.CLEARCACHE()をクリーニングするためにsession.clearcache()が実行されていません。 user = session.selectone(ステートメント、); system.out.println(user);/*。 ADD/削除操作は実行されていません(これらの操作はキャッシュをクリーニングします) 1.2。 MyBatisレベル2キャッシュテスト
1.セカンダリキャッシュをオンにし、次の構成をusermapper.xmlファイルに追加します
<mapper namespace = "me.gacl.mapping.usermapper"> <! - レベル2キャッシュをオンにします - > <cache/>
2。セカンダリキャッシュをテストします
packed me.gacl.test; import me.gacl.domain.user; import me.gacl.util.mybatisutil; import org.apache.ibatis.session.sqlsession; import org.apache.ibatis.session.squlsessionfactory; import org.junit.test; testtwolevelcache {/**テストレベル2キャッシュ* 2つの異なるsqlsessionオブジェクトを使用して、同じクエリ条件でクエリを実行します。 SQLステートメントは2回目のクエリ中に送信されませんが、データはcache*/@testpublic void testcache(){string statement = "me.gacl.usermapper.getuser"; sqlsessionFactory = mybatisutil.getsqlsessionfactory(); Factory.opensession(); sqlsession session = factory.opensession(); //セカンダリキャッシュを使用する場合、ユーザークラスはシリアル化可能なインターフェイス===>ユーザーを実装する必要があります。 system.out.println( "user ="+user); // 2つの異なるsqlsessionオブジェクトが使用されるため、クエリ条件が同じ場合でも、最初のレベルキャッシュは有効になりません。 user = session.selectone(ステートメント、); // session.commit(); system.out.println( "user ="+user);}}} 1.3。二次キャッシュの補足指示
1.マッピングステートメントファイルのすべての選択ステートメントがキャッシュされます。
2。ステートメントファイルのすべての挿入、更新、および削除されたすべての挿入、更新、および削除キャッシュが更新されます。
3.キャッシュは、最近使用されていない(LRU、最近使用されていない)アルゴリズムを使用して再試行されます。
4.キャッシュは、指定された時間間隔に従って更新されます。
5.キャッシュは1024オブジェクトを保存します
キャッシュタグの一般的なプロパティ:
<cache eviction = "fifo" <! - リサイクル戦略はファーストイン、ファーストアウト - > flushinterval = "60000" <! - 自動更新時間60s-> size = "512" <
私はあなたにいくつかの知識を与えます:
Hibernateのように、MyBatisにはキャッシュメカニズムもあります
レベル1キャッシュは、perpetualCacheのハッシュマップローカルキャッシュ(MyBatisが付属しています)に基づいており、そのスコープはセッションです。したがって、セッションがコミットまたは閉じると、キャッシュがクリアされます。
セカンドレベルのキャッシュは、デフォルトではperpetualcacheにも基づいていますが、Ehcacheなどのストレージソースの作成に使用できます。
第1レベルのキャッシュはSQLステートメントをキャッシュしますが、第2レベルのキャッシュは結果オブジェクトをキャッシュします。次の例を参照してください(MyBatisのログレベルはデバッグするように設定されています)