前の記事で mybatis の 1 次キャッシュについて紹介しました。必要な友達はそれを参照してください。
一次キャッシュと比較して、二次キャッシュは範囲が広く、複数の SqlSession で共有できます。
同様に、同じクエリ SQL を送信すると、最初にキャッシュ内が検索され、見つからない場合はデータベースにクエリが実行されます。
各名前空間マッパーには独自のキャッシュ スペースがあります。
2 つのマッパーの名前空間が同じ場合、マッパーの実行によってクエリされたデータは同じ 2 次キャッシュに保存されます
同様に、sqlSession がコミットを実行すると、2 次キャッシュがクリアされます。
設定ファイル (設定なしでデフォルトで有効になります)):
sqlMapConfig.xml:
<setting name="cacheEnabled" value="true"/>
対応するmapper.xml:
必要ない場合2次キャッシュについては、設定で2次キャッシュを無効にすることができます
<select useCache="false"></select>
このようにして、データベースから読み取られるたびに
挿入の実行後にキャッシュが更新されます(キャッシュがクリアされます)。 update、delete を更新しないように設定できます
通常は設定されておらず、この設定によりダーティ リードが発生する可能性があります。
<insert flushCache="false"></insert>
小さな例:
SqlSession session1 = factory.openSession(); SqlSession session2 = factory.openSession(); SqlSession session3 = factory.openSession(); UserMapper mapper1 = session1.getMapper(UserMapper.class); UserMapper mapper2 = session2.getMapper(UserMapper.class); UserMapper mapper3 = session3.getMapper(UserMapper.class); //第一次请求,查询id为1的用户 User user1 = mapper1.findUserById(1); System.out.println(user1); //close 将数据写入二级缓存 session1.close(); //清空二级缓存,UserMapper下的 user1.setUsername("mmm"); mapper3.updateUser(user1); session3.commit(); //第二次查询会从缓存中找 User user2 = mapper2.findUserById(1); System.out.println(user2); session2.close();
キャッシュされるオブジェクトに注意してください。これらのキャッシュされたデータは逆シリアル化されてハードディスクまたは他の場所に書き込まれる可能性があるため、ここでは Serilizable インターフェイスを実装する必要があります。
上記は編集者によって紹介された Mybatis の 2 次キャッシュです。ご質問がございましたら、メッセージを残してください。編集者がすぐに返信します。また、PHP 中国語 Web サイトをサポートしていただきありがとうございます。
Mybatis の 2 次キャッシュ関連記事をさらに詳しく理解するには、PHP 中国語 Web サイトに注目してください。