Mybatisの基本(8)クエリキャッシュ

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レベルのキャッシュ)にシリアル化されるため、クエリ結果クラスをシリアル化する必要があります。
ここに画像の説明を挿入

セカンダリキャッシュをオンにする

  1. conf.xmlファイルを構成します
<settings>
	<setting name="cacheEnabled" value="true"/>
</settings>
  1. 特定のmapper.xmlでオンにすることを宣言します
<!-- 该mapper操作Student -->
<mapper namespace="pers.qiu.StudentMapper">
	<cache/>
</mapper>
  1. シリアル化インターフェースを実装する
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>

上記のメソッドを介して、xxx​​2メソッドは第2レベルのキャッシュをオフにします。そして、xxx​​1と他の閉じられていないメソッドは両方とも第2レベルのキャッシュを開きます。

セカンダリキャッシュをクリーンアップします

第1レベルのキャッシュと同じように、commitメソッドを使用してキャッシュをクリーンアップします。

おすすめ

転載: blog.csdn.net/qq_43477218/article/details/113097183