記事のディレクトリ
Mybatisの基本(8)
クエリキャッシュ
レベル1キャッシュ(Mybatisに含まれています)
第1レベルのキャッシュは、クエリ情報をSqlSessionオブジェクトに配置し、SqlSessionオブジェクトをメモリに配置します。
レベル1のキャッシュクリーニング
いつSqlSessionオブジェクトのcommitメソッドを使用します、SqlSessionオブジェクトのデータがクリアされます。
レベル2キャッシュ(手動で開く必要があります)
セカンダリキャッシュのソース:
- Mybatis独自のセカンダリキャッシュ
- サードパーティのセカンダリキャッシュ
Mybatis独自のセカンダリキャッシュ
同じ名前空間(マッパータグの属性)によって生成されたマッパーオブジェクトは、キャッシュを共有します。
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
StudentMapper studentMapper2 = session.getMapper(StudentMapper.class);
studentMapperとstudentMapper2は同じバッファ領域を共有します。マッパーはマッパーのクラス名と登録(つまり、名前空間)によって決定されるためです。
注意!第2レベルのキャッシュは、第2レベルのキャッシュのデータがハードディスクに保存されるという点で第1レベルのキャッシュとは異なります。したがって、シリアル化クラスが呼び出されます。
クエリの後、クエリ結果はハードディスク(第2レベルのキャッシュ)にシリアル化されるため、クエリ結果クラスをシリアル化する必要があります。
セカンダリキャッシュをオンにする
- conf.xmlファイルを構成します
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
- 特定のmapper.xmlでオンにすることを宣言します
<!-- 该mapper操作Student -->
<mapper namespace="pers.qiu.StudentMapper">
<cache/>
</mapper>
- シリアル化インターフェースを実装する
class Student implements Serializable{
}
// 如果Student类中有其他类作为属性,则应该级联进行序列化。例如Student中有StudentCard对象作为属性:
class StudentCard implements Serializable{
}
キャッシュのタイミング
Mybatisがキャッシュする時間は、セッションオブジェクトが閉じられたとき、つまりsession.close()のときです。(第1レベルのキャッシュとは異なり、第1レベルのキャッシュは自動的にキャッシュに保存されます)
2次キャッシュを無効にする
マッパーファイルでキャッシュタグを使用すると、マッパー全体のすべてのメソッドで第2レベルのキャッシュが有効になりますが、一部のメソッドでは第2レベルのキャッシュを無効にする必要がある場合があります。
<mapper namespace="">
<cache/>
<select id="xxx1" xxx>
xxx
</select>
<select id="xxx2" xxx useCache="false">
xxx
</select>
</mapper>
上記のメソッドを介して、xxx2メソッドは第2レベルのキャッシュをオフにします。そして、xxx1と他の閉じられていないメソッドは両方とも第2レベルのキャッシュを開きます。
セカンダリキャッシュをクリーンアップします
第1レベルのキャッシュと同じように、commitメソッドを使用してキャッシュをクリーンアップします。