mybatis 1レベルキャッシュ、2レベルキャッシュおよびEnCache、Redisの統合により、汚れた読み取りを回避

2383 ワード

参考書目:『mybatis入門から精通へ』劉増輝著
著者GitHub:https://github.com/abel533/MyBatis-Spring-Boot
一級キャッシュ
mybatisの1次キャッシュはSqlSessionのライフサイクルに存在し、同じSqlSessionでクエリを実行すると、mybatisは実行するメソッドとパラメータによってキャッシュされたキー値を生成し、キー値とクエリ結果をMapオブジェクトに格納します.同じSqlSessionで実行されるメソッドとパラメータが完全に一致する場合、アルゴリズムによって同じキー値が生成され、Mapキャッシュオブジェクトに既にキー値が存在する場合、キャッシュ内のオブジェクトが返されます.
したがって、データベースの更新操作後にキャッシュを空にする必要がありますが、クエリー操作後にキャッシュを空にする必要はありません.そうしないと、クエリーのパフォーマンスが低下します.
MybatisはMapperでxmlのインタフェースのインプリメンテーションに属性flushCache=「true」を追加して、1レベルのキャッシュをクリアします.
完全な例は次のとおりです.

二次キャッシュ
レベル1キャッシュとは異なり、SqlSessionライフサイクル内にのみ存在します.SqlSessionFactoryのライフサイクル内に存在します.複数のSqlSessionFactoryが存在する場合、それらのキャッシュはそれぞれのオブジェクトにバインドされ、キャッシュデータはそれぞれのオブジェクトにバインドされ、キャッシュデータは一般的に共通しない.Redisのようなキャッシュ・データベースを使用する場合にのみ、キャッシュを共有できます.
mybatisはデフォルトで2次キャッシュがオンになっているので、設定する必要はありません.2次キャッシュをオフにするにはmybatisのプロファイルで
この値はデフォルトでtrueです.つまり、2次スキップをオンにします.
読み取り可能ライトキャッシュを使用する場合は、SerializedCacheを使用してキャッシュをシーケンス化できます.このキャッシュクラスでは、シーケンス化されたすべてのオブジェクトがSerializableインタフェースを実装する必要があるため、エンティティクラスをインタフェースを実装したクラスに変更する必要があります.
また、EnCacheとRedisを使用して二次キャッシュを実現することもできます.
汚れたデータの生成と回避
2次キャッシュは効率を向上させ、データベース・サーバの圧力を軽減しますが、不適切な使用で汚れたデータが発生しやすくなります.
mybatisの2次キャッシュはネーミングスペースにバインドされているため、通常、1つのMapperマッピングファイルには独自の2次キャッシュがあり、異なるMapperの2次キャッシュは互いに影響しません.リレーショナル・データベースでは、マルチテーブル・コンビネーション・クエリーがよく使用されます.マルチテーブル・クエリーを関連付けると、必ずそのクエリーがネーミング・スペースの下のマッピング・ファイルに格納され、1つのマルチテーブルのクエリーがネーミング・スペースの下の2次キャッシュにキャッシュされます.これらのテーブルに関する削除変更操作は、通常、1つのマッピングファイルにはありません.そのため、他のネーミングスペースの2次キャッシュが変更されると、マルチテーブルクエリの2次キャッシュが変更されず、汚れた読み取りが発生する可能性があります.
汚れた読みを避けるにはどうすればいいですか?
参照キャッシュを使用する必要があります.いくつかのテーブルが1つのビジネス全体として機能する場合、通常、関連するERテーブルを複数同時に同じ2次キャッシュを使用することで、汚れたデータの問題を解決できます.
例は次のとおりです.

  
  

2次キャッシュ適用シーン:
  • クエリーを主とするアプリケーションでは、できるだけ少ない削除変更操作
  • しかありません.
  • のほとんどがフォーム操作で存在する場合、相互に関連することは少ないため、汚れたデータは発生しません.
  • は、業務区分ごとにテーブルをグループ化できる場合、関連テーブルが比較的少ない場合は、参照キャッシュ設定により設定することができる.
  • ダーティリードがシステムに影響を及ぼさない場合は、使用も考えられる.
  • データが汚れていないことを保証できない場合は、ビジネス層で2次キャッシュの代わりに制御可能なキャッシュを使用することを推奨します.

  •