MyBatisのキャッシュの役割と仕組みは何ですか?
MyBatisのキャッシュ機能はシステムの性能を向上させ、データベースへのアクセス回数を減らし、データベースの負荷を軽減します。データベースのクエリ結果をメモリにキャッシュすることで、同じクエリを繰り返し実行する必要がなくなり、システムの応答速度が向上します。
MyBatisのキャッシュ原理は、SqlSession層と2次キャッシュ層でキャッシュ制御を行うことです。SqlSession層では、MyBatisはPerpetualCacheを使用して、HashMapベースのキャッシュモデルを実装し、クエリ結果をメモリにキャッシュします。2次キャッシュ層では、MyBatisはRedisやEhcacheなどの外部キャッシュシステムにキャッシュを保存することをサポートしています。
MyBatisのキャッシュメカニズムは以下の原則に基づいています。
- 通常、MyBatisは各mapperのクエリごとにキャッシュを作成し、そのキャッシュの寿命はSqlSessionの寿命と同じです。
- 同じSqlSession内で、2つのクエリの入力パラメータとSQL文が完全に一致する場合、2回目のクエリはデータベースの検索を実行せず、結果をキャッシュから直接取得します。
- 同じSqlSession内で、2回のクエリの間に挿入、更新、削除などの操作が行われた場合、そのmapperのキャッシュはクリアされます。
MyBatisのキャッシュメカニズムはオブジェクトへの参照に基づいていることに注意する必要があります。つまり、キャッシュはクエリ結果オブジェクトの参照を保持しているため、コピーではありません。そのため、MyBatisのキャッシュを使用する際には、返される結果オブジェクトの可変性に注意し、外部でキャッシュオブジェクトを変更することで他のクエリ結果に影響を与えないようにする必要があります。