mybatis同じsqlクエリで2回目の結果は検出されません

1299 ワード

MyBatisキャッシュ紹介[1]:レベル1キャッシュ:セッションキャッシュ、役割ドメインはセッションであり、セッションflushまたはcloseの後、セッション内のすべてのCacheがクリアされ、デフォルトでオンになります.注:spring(mybatis-springを使用)を統合する場合:
クエリspringごとにSqlSessionが再作成されるため、一級キャッシュは有効ではありません.
トランザクションを開くと、springは同じSqlSessionを使用してクエリーを行うので、この場合、レベル1のキャッシュは有効になります.
2次キャッシュ:役割ドメインがMapper(Namespace)であるグローバルキャッシュです.デフォルトではオフです.
質問理由:上記MyBatisのキャッシュメカニズムについて説明しましたが、プロジェクト構成を確認したところ、1回目のクエリから結果がキャッシュに格納され、プログラムによって検出された結果リストがremove操作されたため、キャッシュ中のリストが変化し、2回目のクエリではキャッシュから操作されたリストが検出されます(mybatisが返すエンティティクラスのメモリアドレスは同じ)ため、以前はプロジェクトでSpringと統合されていましたが、使用していたsessionはSqlSessionTemplateで、ここではデフォルトで1レベルのキャッシュが閉じられていましたが、今日のプロジェクトではSpringと統合されていません.sessionを作成するにはSqlsessionFactoryのopenSession()メソッドは、ここで検索するときにデフォルトでキャッシュからクエリーされます.以上、2回目に検索したのはキャッシュ内のデータだけです[2].
ソリューション:2回目にキャッシュからデータを読み出す以上、プロジェクト構成を変更して1レベルのキャッシュを閉じることはできないので、キャッシュをリフレッシュすることで必要な目的を達成できます.1:SqlSessionUtils.getSqlSession(sqlSessionFactory).clearCache()メソッドでキャッシュをリフレッシュする方法2:mapper.xml対応の検索文にflushCache="true"を追加