クエリキャッシュ
Mybatisの1次キャッシュのスコープは同じSqlSessionです。同じSQLステートメントが同じsqlSessionで2回実行されます。最初の実行後、データベースでクエリされたデータはキャッシュ(メモリ)に書き込まれ、2回目はキャッシュから取得されますデータはデータベースからクエリされなくなり、クエリの効率が向上します。sqlSessionが終了すると、sqlSessionの1次キャッシュは存在しません。Mybatisはデフォルトで一次キャッシュを有効にします。
Mybatisセカンダリキャッシュは複数のSqlSessionsによって共有され、そのスコープはマッパーの同じ名前空間です。異なるsqlSessionが同じ名前空間でSQLステートメントを2回実行し、同じパラメーターをSQLに渡して、最終的に同じSQLステートメントを実行します。実行が完了すると、データベースでクエリされたデータはキャッシュ(メモリ)に書き込まれ、2度目にキャッシュから取得されるデータはデータベースからクエリされないため、クエリの効率が向上します。Mybatisはデフォルトでは二次キャッシュを有効にしません。グローバルパラメータの設定で二次キャッシュを有効にする必要があります。
レベル1キャッシュ
1次キャッシュ領域は、SqlSessionに従って分割されます。
各クエリは最初にキャッシュ領域で見つかります。データベースからのクエリが見つからない場合、データはクエリが見つかったときにキャッシュに書き込まれます。
Mybatis内部ストレージキャッシュはHashMapを使用し、キーはhashCode + sqlId + Sqlステートメントで、値はクエリマッピングから生成されたJavaオブジェクトです。
sqlSessionが挿入、更新、削除などの操作を実行した後、コミットが送信されると、コミット領域はクリアされます。
二次キャッシュ
二次キャッシュ領域はマッパーの名前空間に応じて分割されます。同じ名前空間のマッパークエリデータは同じ領域に配置されます。マッパープロキシ方式を使用すると、各マッパーの名前空間が異なります。このとき、二次キャッシュ領域はマッパーに従って分割されていることがわかります。 。
各クエリは最初にキャッシュ領域で見つかります。データベースからのクエリが見つからない場合、データはクエリが見つかったときにキャッシュに書き込まれます。
Mybatisの内部ストレージキャッシュはHashMapを使用し、キーはhashCode + sqlId + Sqlステートメントです。valueは、クエリからのマッピングによって生成されたJavaオブジェクトです
sqlSessionが挿入、更新、削除などの操作を実行した後、コミットが送信されると、コミット領域はクリアされます。
二次キャッシュをオンにする
コア構成ファイルSqlMapConfig.xmlに追加します
<setting name="cacheEnabled" value="true"/>
|
説明文 |
許容値 |
デフォルト値 |
cacheEnabled |
この構成ファイルの下のすべてのキャッシュのグローバルオン/オフ設定を設定します。 |
真/偽 |
本当 |
マッパーマッピングファイルに行を追加するには、次のようにします。<cache />。これは、このマッパーが二次キャッシュを有効にすることを意味します。
二次キャッシュには、java.io.Serializableインターフェースを実装して直列化および直列化復元操作を実装するために、クエリ結果によってマップされたpojoオブジェクトが必要です。親クラスがある場合、メンバーpojoは直列化インターフェースを実装する必要があります。
public class Orders implements Serializable
public class User implements Serializable
二次キャッシュを無効にする
ステートメントでuseCache = falseを設定すると、現在の選択ステートメントの2次レベルキャッシュが無効になる可能性があります。つまり、すべてのクエリがクエリに対してsqlを発行します。デフォルトはtrueで、SQLは2次レベルキャッシュを使用します。
<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">
キャッシュを更新する
マッパーの同じ名前空間で、他の挿入、更新、削除操作データがある場合は、キャッシュを更新する必要があります。キャッシュが更新されないと、ダーティリードが発生します。
ステートメント構成でflushCache = "true"プロパティを設定します。デフォルトでは、キャッシュを更新するのはtrueです。falseに変更すると、更新されません。キャッシュを使用する場合、データベーステーブルのクエリデータを手動で変更すると、ダーティリードが発生します。
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User" flushCache="true">
MyBatisキャッシュパラメータ
flushInterval(リフレッシュ間隔)は任意の正の整数に設定でき、ミリ秒の形式で妥当な期間を表します。デフォルトでは設定されていません。つまり、更新間隔はなく、キャッシュはステートメントが呼び出されたときにのみ更新されます。
サイズ(参照の数)は任意の正の整数に設定できます。キャッシュするオブジェクトの数と、実行中の環境で使用可能なメモリリソースの数を覚えておいてください。デフォルト値は1024です。
readOnly属性は、trueまたはfalseに設定できます。読み取り専用キャッシュは、キャッシュオブジェクトの同じインスタンスをすべての呼び出し元に返します。したがって、これらのオブジェクトは変更できません。これは非常に重要なパフォーマンス上の利点を提供します。読み取り/書き込みキャッシュは、キャッシュされたオブジェクトのコピーを(シリアル化によって)返します。これは遅くなりますが安全であるため、デフォルトはfalseです。
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
このより高度な構成では、FIFOバッファーが作成され、60秒ごとに更新され、結果オブジェクトまたはリストへの512参照が格納されます。返されたオブジェクトは読み取り専用と見なされるため、異なるスレッドの呼び出し元間でそれらを変更すると、競合が発生します。利用可能な回復戦略は、デフォルトはLRUです。
- LRU-最も最近使用されたもの:最も長い間使用されていないオブジェクトを削除します。
- FIFO –先入れ先出し:オブジェクトがキャッシュに入る順にオブジェクトを削除します。
- SOFT-Soft参照:ガベージコレクターのステータスとソフト参照ルールに基づいてオブジェクトを削除します。
- WEAK-Weak Reference:ガベージコレクターのステータスと弱い参照ルールに基づいて、オブジェクトをより積極的に削除します。
MyBatis統合Ehcache
EhCacheは、純粋なJavaインプロセスキャッシュフレームワークです。広く使用されているオープンソースのJava分散キャッシュであり、高速で無駄のない特性を備えています。HibernateのデフォルトのCacheProviderです。
統合:個人の開発部分の問題をできるだけ早期に発見するために、ソフトウェアの個人のR&D部分がソフトウェアの全体的な部分に配信されます。
デプロイ:コードは、実行可能な開発/テストセクションにできるだけ早く配信されるので、できるだけ早くテストできます。
配信:R&Dは、生産環境の問題をできるだけ早く発見するために、できるだけ早く顧客に配信されます。
分散:サービスは複数のサブサービスに分割され、異なるサーバーにデプロイされます。
クラスターのデプロイメント:同じサービスが複数のサーバーにデプロイされます。
Mybatis統合ehcacheの原則
Mybatisは、次のような2次キャッシュインターフェイスを提供します。
デフォルトの実装クラス:
キャッシュインターフェースを実装することにより、mybatisキャッシュデータを他のキャッシュデータベースに統合できます。mybatisの特徴はsql操作です。キャッシュデータの管理はmybatisの特徴ではありません。キャッシュのパフォーマンスを向上させるために、mybatisとサードパーティのキャッシュデータベース(ehcache、memcacheなど)が統合されています、Redisなど
ステップ1:キャッシュされた依存関係を導入する
maven坐标:
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.0.2</version>
</dependency>
ステップ2:キャッシュ構成ファイルを導入する
クラスパスの下に追加:ehcache.xml、内容は次のとおりです。
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="F:\\develop\\ehcache" />
<defaultCache
maxElementsInMemory="1000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>
プロパティの説明:
- diskStorel:ディスク内のデータの保存場所を指定します
- defaultCachel:CacheManager.add( "demoCache")を使用してキャッシュを作成する場合、EhCacheは<defalutCache />で指定された管理戦略を採用します
以下の属性が必要です。
- maxElementsInMemory-メモリにキャッシュされる要素の最大数
- maxElementsOnDisk-ディスクにキャッシュされる要素の最大数(0が無限を意味する場合)
- eternal-キャッシュされた要素が期限切れにならないかどうかを設定します。trueの場合、キャッシュされたデータは常に有効です。falseの場合、timeToIdleSeconds、timeToLiveSecondsに従って判断する必要があります。
- overflowToDisk-メモリキャッシュがオーバーフローしたときに期限切れの要素をディスクにキャッシュするかどうかを設定します
次の属性はオプションです。
- timeToIdleSeconds-EhCacheにキャッシュされたデータの前後の2回の訪問の時間がtimeToIdleSecondsプロパティの値を超えると、データは削除されます。デフォルト値は0で、これは無限のアイドル時間です
- timeToLiveSeconds-キャッシュ要素の有効な有効期間。デフォルトは0です。つまり、要素の生存時間は無限です
- diskSpoolBufferSizeMB-このパラメーターは、DiskStore(ディスクキャッシュ)のバッファー領域のサイズを設定します。デフォルトは30MBで、各キャッシュには独自のバッファーが必要です
- diskPersistent-VMの再起動時にディスクがEhCacheにデータを保存できるようにするかどうか、デフォルトはfalse
- diskExpiryThreadIntervalSeconds-ディスクキャッシュクリーニングスレッドの実行間隔。デフォルトは120秒です。120秒ごとに、対応するスレッドがEhCacheのデータをクリーンアップします
- memoryStoreEvictionPolicy-メモリキャッシュが最大に達したときに、新しい要素が追加されたときに、要素の戦略をキャッシュから削除します。デフォルトはLRU(使用頻度が最も低い)、オプションのLFU(使用頻度が最も低い)およびFIFO(先入れ先出し)です。
ステップ3:ehcacheをオンにする
EhcacheCacheは、ehcacheのCacheインターフェースの実装です。
mapper.xmlファイルを変更し、キャッシュでEhcacheCacheを指定し、必要に応じてキャッシュパラメーターを調整します。
<cache type="org.mybatis.caches.ehcache.EhcacheCache" >
<property name="timeToIdleSeconds" value="3600"/>
<property name="timeToLiveSeconds" value="3600"/>
<!-- 同ehcache参数maxElementsInMemory -->
<property name="maxEntriesLocalHeap" value="1000"/>
<!-- 同ehcache参数maxElementsOnDisk -->
<property name="maxEntriesLocalDisk" value="10000000"/>
<property name="memoryStoreEvictionPolicy" value="LRU"/>
</cache>
アプリケーションシナリオ
訪問数が多く、ユーザーがリアルタイムのクエリ結果に対する高い要件を持たないクエリリクエストの場合、mybatisセカンダリキャッシュテクノロジーを使用して、データベースアクセスを削減し、アクセス速度を向上させることができます。時間のかかる統計分析SQL、電話料金などのビジネスシナリオクエリSQLなど
実装方法は次のとおりです。更新間隔を設定することにより、mybatisは自動的に一定の間隔でキャッシュをクリアし、必要に応じてデータ変更の頻度(30分、60分、24時間など)に従ってキャッシュの更新間隔flushIntervalを設定します。
制限事項
Mybatisの2次キャッシュは、次の要件など、きめ細かいデータレベルのキャッシュには適していません。製品情報のキャッシュへのアクセスは多数あるため、製品情報をキャッシュしますが、ユーザーは毎回最新の製品情報をクエリする必要があります。 mybaitsの2次キャッシュを使用すると、製品情報が変更されると製品のキャッシュ情報のみが更新され、他の製品の情報は更新されず、mybaitsの2次キャッシュ領域がマッパーユニットで分割されるため、製品のキャッシュ情報のみが更新されることを認識できません。製品情報のキャッシュデータをすべてクリアします。このような問題を解決するには、需要に応じてビジネスレイヤーでデータを的確にキャッシュする必要があります。