read-write是嚴格的讀取策略。在將一個對象放到緩存時,同時會加一把鎖。在當前session沒有關閉的情況下,其他session不可以訪問緩存中的同一個對象。真到此鎖定的session關閉。
@Test
public void testUpdate(){
Session s2 = HibernateUtils.openSession();
Person p1 = (Person) s2.get(Person.class, "402881e4345a53ce01345a543b9a0004");
System.out.println("第一次查詢"+p1); //查詢獲取一個新的對象
s2.clear(); //將一級緩存中的數據清除
boolean boo = //判斷二級緩存中,是否存在此對象,爲true
HibernateUtils.getSessionFactory()
.getCache()
.containsEntity(Person.class,"402881e4345a53ce01345a543b9a0004");
System.out.println("是否存在這個對象:"+boo);//true
Person p2 = (Person) s2.get(Person.class, "402881e4345a53ce01345a543b9a0004");//read-writeg下爲什麼不查二級緩存
System.out.println("同一個session第二次查詢"+p2);//使用同一個session查詢,結果因爲是read-write,
//因爲對象已經上鎖,所以不會從二級緩存中返回數據
//s2.close(); //關閉或是不關閉
System.out.println("上一個Session關閉以後");
Session s3 = HibernateUtils.openSession();
boo =
HibernateUtils.getSessionFactory()
.getCache()
.containsEntity(Person.class,"402881e4345a53ce01345a543b9a0004");
System.out.println("是否存在這個對象:"+boo);//true
Person p3 = (Person) s3.get(Person.class, "402881e4345a53ce01345a543b9a0004");//read-write下,爲什麼這兒查二級緩存
System.out.println(p3);
s3.close();
}