※二級快取模式
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()的清除全部的方法
沒有留言:
張貼留言