2015年10月31日 星期六

管理二級快取 (Hibernate3.x 十)

※二級快取模式

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()的清除全部的方法

沒有留言:

張貼留言