- ほとんどの永続フレームワークと同様に、Mybatisもキャッシュ戦略を提供します。これにより、データベースクエリの数が減り、パフォーマンスが向上します。
- Mybatisのキャッシュは、1次キャッシュと2次キャッシュに分かれています。
Mybatis 1次キャッシュ
- 1次レベルキャッシュはSqlSession範囲のキャッシュです。変更、追加、削除、コミット()、閉じる()、フラッシュ()およびその他のSqlSessionのメソッドが呼び出されると、1次レベルキャッシュがクリアされます。
-
初めてユーザーID 1のユーザー情報をクエリするときは、最初にキャッシュにID 1のユーザー情報があるかどうかを確認します。ない場合は、データベースからユーザー情報をクエリします。
-
ユーザー情報を取得し、ユーザー情報を1次キャッシュに保存します。
-
sqlSessionがコミット操作(挿入、更新、削除を実行)を実行する場合は、SqlSessionの1次レベルのキャッシュをクリアします。これは、キャッシュに最新の情報を格納させ、ダーティリードを回避することを目的としています。
-
ユーザーID 1のユーザー情報のクエリを開始する2回目は、最初にキャッシュにID 1のユーザー情報があるかどうかを調べます。キャッシュにある場合は、キャッシュから直接ユーザー情報を取得します。
Mybatis 2次キャッシュ
-
2次キャッシュはマッパーレベルキャッシュです。複数のSqlSessionが同じマッパーによってマップされた同じSQLステートメントで動作します。複数のSqlSessionが2次レベルキャッシュを共有できます。2次キャッシュはSqlSession全体にあります。
-
二次キャッシュの構造図:
-
最初にmybatisの2次キャッシュを開きます。sqlSession1はユーザー情報をクエリし、ユーザー情報をクエリすると、クエリデータが2次キャッシュに格納されます。
-
SqlSession3が同じマッパーマップの下でSQLを実行し、コミットを実行すると、マッパーマップの下の2次レベルキャッシュ領域のデータは消去されます。
-
sqlSession1と同じユーザー情報を照会するsqlSession2は、最初にキャッシュに移動して、データがあるかどうか、キャッシュから直接データがあるかどうかを確認します。
- 注:2次キャッシュに格納されているデータはオブジェクトではないため、
User findById(int id);
2回返される2つのUserオブジェクトのアドレス値は異なります
2次キャッシュのオンとオフを切り替える
- 手順1:SqlMapConfig.xmlファイルで2次キャッシュを開く
<settings>
<!-- 开启二级缓存的支持 -->
<setting name="cacheEnabled" value="true"/>
</settings>
- cacheEnabledの値はデフォルトでtrueであるため、このステップは構成なしで省略できます。Trueは2次キャッシュを開くことを意味し、Falseは2次キャッシュを無効にすることを意味します。
- ステップ2:関連するMapperマッピングファイルを構成する
<mapper namespace="cn.myp666.dao.IUserDao">
<!-- 开启二级缓存的支持 -->
<cache></cache>
</mapper>
<cache>
ラベルは、現在のマッパーマップが2次キャッシュを使用することを示しており、区別する標準はマッパーの名前空間の値に依存します。
- ステップ3:ステートメントのuseCache属性を構成する
<!-- 根据 id 查询 -->
<select id="findById" resultType="user" parameterType="int" useCache="true">
select * from user where id = #{uid}
</select>
- UserDao.xmlマッピングファイルのタグでuseCache =” true”を設定して、現在のステートメントが2次キャッシュを使用することを示します。2次キャッシュを使用しない場合は、falseに設定できます。
- 注:最新のデータsqlを必要とするクエリごとに、useCache = falseを設定して、2次キャッシュを無効にする必要があります。
L2キャッシュに関する考慮事項
- 私たちは、二次キャッシュを使用すると、キャッシュされたクラスが実装する必要があり
java.io.Serializable
ますが、オブジェクトのシリアル化を保存するために使用することができるように、インターフェイスを。
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
}