※二級快取模式
SessionFactory sf = HibernateUtil2.getSessionFactory();
Session s1 = sf.openSession();
Session s2 = sf.openSession();
try {
// CacheMode.GET;
// CacheMode.IGNORE;
// CacheMode.NORMAL;
// CacheMode.PUT;
// CacheMode.REFRESH;
// s1.setCacheMode(CacheMode.GET);
// s2.setCacheMode(CacheMode.PUT);
s2.setCacheMode(CacheMode.REFRESH);
Emp e1 = (Emp) s1.get(Emp.class, 7369);
System.out.println("e1:" + e1.getEname());
Emp e2 = (Emp) s2.get(Emp.class, 7369);
System.out.println("e2:" + e2.getEname());
} catch (Exception e) {
System.err.println("例外錯誤!");
e.printStackTrace();
} finally {
if (s1.isOpen()) {
s1.close();
}
if (s2.isOpen()) {
s2.close();
}
}
※CacheMode共有五種模式:
.GET:向二級快取讀取,update時才有寫入
.IGNORE:忽略二級快取
.NORMAL:向二級快取讀、寫
.PUT:向二級快取寫入不讀
.REFRESH:向二級快取寫入不讀,設定hibernate.cache.use_minimal_puts可強制讀取資料庫
官方說明在這裡,沒有介紹IGNORE,但程式碼確實是有的,反正就是不用快取,沒什麼好講的
※如以上的程式如果只有設定二級快取設定時,就會有二級快取
※增加一行s1.setCacheMode(CacheMode.GET),就沒有快取了,因為GET讀取,沒有將資料寫入快取,所以s2讀不到
※而 s2.setCacheMode(CacheMode.PUT),因s1還是有快取,但s2只寫不讀一樣讀不到
※而REFRESH和PUT在這個例子一樣
※清除二級快取
SessionFactory sf = HibernateUtil2.getSessionFactory();
Session s1 = sf.openSession();
Session s2 = sf.openSession();
Emp e1 = (Emp) s1.get(Emp.class, 7369);
System.out.println("e1:" + e1.getEname());
sf.evict(Emp.class);
Emp e2 = (Emp) s2.get(Emp.class, 7369);
System.out.println("e2:" + e2.getEname());
※雖然可清除快取,但此方法已廢棄了,而且看起來也沒有類似clear()的清除全部的方法
沒有留言:
張貼留言