公式Webサイトで説明されているセカンダリキャッシュ属性readOnly
:
readOnly(読み取り専用)属性はtrueまたはfalseに設定できます。
1.(true)読み取り専用キャッシュは、キャッシュされたオブジェクトの同じインスタンスをすべての呼び出し元に返します。したがって、これらのオブジェクトは変更できません。これにより、パフォーマンスが大幅に向上します。
2.(false)読み取りおよび書き込み可能なキャッシュは、キャッシュされたオブジェクトのコピーを(シリアル化によって)返します。速度は遅くなりますが、より安全になるため、デフォルト値はfalseです。
私自身の理解によると
1.readOnly = trueの場合、現時点ではデータの読み取りにのみキャッシュを使用するように求められ ます。データを変更しないでください。この時点でAがキャッシュから抽出したデータを変更すると、次のようになります。キャッシュ内でアクセスされるデータ。これも変更されます。Bはこの時点でデータを読み取り、Aによって変更された間違ったデータを読み取ります。
2. readOnly = falseの場合、Aはキャッシュから抽出されたデータを変更し、キャッシュに保存されている元のデータを変更しません。Bはこの時点で間違ったデータを読み取らないため、データの安全性が確保されます。
コードを実行した結果は次のとおりです。
readOnly = trueが設定されている場合
@Test
// 二级缓存测试 1
public void testCacheLevel2() {
// 得到 session对象
final SqlSession session1 = factory.openSession();
final SqlSession session2 = factory.openSession();
// 得到 mapper 对象 (dao)
final UserMapper mapper1 = session1.getMapper(UserMapper.class);
final UserMapper mapper2 = session2.getMapper(UserMapper.class);
final User user = mapper1.selectById(1);
System.out.println(user);
// 关闭 session 1
session1.close();
System.out.println("before session query =============");
//从缓存中获取数据赋给user2
final User user2 = mapper2.selectById(1);
//改变username
user2.setUsername("shit2");
System.out.println("user2 " + user2);
System.out.println("user" + user );
System.out.println(user == user2);
// 关闭
session2.close();
}
結果:名前(Wang Wu)が(shit2)に変更されると、ユーザーオブジェクトのname属性も(shit2)に変更されることがわかります。
readOnly = falseが設定されている場合
結果:名前(Wang Wu)が(shit2)に変更された場合、ユーザーオブジェクトのname属性は変更されていませんが、変更されていることがわかります(Wang Wu)。
変更されたオブジェクトはキャッシュのコピーのみであり、キャッシュに格納されているデータの元のオブジェクトは変更されていないことが理解できます。