2019獨角獸企業重金招聘Python工程師標準>>>
一、Clear 方法
無論是Load 還是 Get 都會首先查找緩存(一級緩存) 如果沒有,才會去數據庫查找,調用Clear() 方法,可以強制清除Session緩存。例:
public void testClear()
{ Session session = HibernateUitl.getSessionFactory().getCurrentSession(); session.beginTransaction(); Teacher t = (Teacher) session.get(Teacher.class, 3); System.out.println(t.getName()); session.clear();//這里不clear只會執行一次sql語句,有clear會執行2次 Teacher t2 = (Teacher) session.get(Teacher.class, 3); System.out.println(t2.getName()); session.getTransaction().commit(); 10.}
}
?二、Flush 方法
可以強制進行從內存到數據庫的同步。例:
public void testFlush(){ Session session = HibernateUitl.getSessionFactory().getCurrentSession(); session.beginTransaction(); Teacher t = (Teacher) session.get(Teacher.class, 3); t.setName("yyy"); session.flush();//有flush會執行2次UPDAE,沒有會只執行一次 t.setName("yyyyy"); session.getTransaction().commit();
}
?
Flush方法是可以設置的,也就是 fulsh 什么時候執行是可以設置的,在session.beginTransaction 前設置 FlushMode
session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL);
這里 FlushMode 有 5 個值可選
Always: 任何代碼都會 Flush
AUTO: 默認方式 – 自動
Commit: COMMIT 時
Never: 始終不
MANUAL: 手動方式
設置 FlushMode 有個好處是可以節省開銷,比如默認 session 只做查詢時,就可以不讓他與數據庫同步了。
三、Evict 方法
會把指定的緩沖對象進行清除,而 Clear 方法則是把緩沖區內的全部對象清除,但不包括操作中的對象。
注意事項: Flush 方法和 Evict 方法一起使用出現的問題
Flush 方法和 Evict 方法一起使用出現的時候,一定要注意使用的順序,否知會出現異常。下面的代碼就是正確的使用順序:
//因為user的主鍵生成策略采用的是uuid,所以調用完成save后,
//只是將user納入到了session的管理
//不會發出insert語句,但是id已經生成,session中existsInDatebase狀態為false
session.save(user);
//flush后hibernate會清理緩存,會將user對象保存到數據庫中
//(強制更新數據庫,結果但不一定,因為commit時候可能會出現事物回滾)
//并且設置session中existsInDatebase的狀態為true
session.flush();
//將user對象從session中逐出,即session的EntityEntries屬性中逐出
session.evict(user);
//可以成功提交,因為hibernate在清理緩存時,
//在session的insertions集合中無法找到user對象
//所以就不會發出insert語句,也不會更新session中的existsInDatabase的狀態
tx.commit();
?