Session緩存
在 Session 接口的實現中包含一系列的 Java 集合, 這些 Java 集合構成了 Session 緩存。只要 Session 實例沒有結束生命週期,且沒有清理緩存,則存放在它緩存中的對象也不會結束生命週期。
Session 緩存可減少 Hibernate 應用程序訪問數據庫的頻率。
利用反射查詢對象:
@Test
public void testCache(){
News news = session.get(News.class, 1);
System.out.println(news );
News news2 = session.get(News.class, 1);
System.out.println(news2);
System.out.println(news==news2);
}
結果如下:
兩次獲取News對象,只發送了一條查詢語句。這就是Session緩存,也就是一級緩存。位於緩存中的數據叫做持久化對象。
站在持久化角度,Hibernate將緩存分了4種狀態:持久化、臨時、遊離、刪除。
Session有3個緩存方法:
1、flush()方法
作用:使數據表中的記錄和session緩存中的對象的狀態保持一致,會發送對應的SQL語句,但不會提交事務。
爲了確保數據一致,在以下會調用flush()方法:
1)顯示的調用。session.flush();
2)事務提交的時候,會先調用flush(),然後再提交事務。
3)執行HQL或QBC查詢。
4)若記錄的ID是native(底層數據庫自增的形式)生成的,在調用save()方法後,立即發送insert語句。
2、refresh()方法
作用:會強制發送SELECT語句,以使session緩存中對象的狀態和數據表中對應的記錄保持一致。
打上斷點,debug測試:
修改數據庫中的數據:Php——>Java
得到的結果還是一樣,而且也沒有強制發送SQL語句。
使用了refresh()方法後:
在Hibernate中設置隔離級別:
mysql的默認隔離級別是REPEATABLE READ,Oracle的默認隔離級別是READ COMMITED。
JDBC 數據庫連接使用數據庫系統默認的隔離級別. 在 Hibernate 的配置文件中可以顯式的設置隔離級別. 每一個隔離級別都對應一個整數:
- READ UNCOMMITED
- READ COMMITED
- REPEATABLE READ
- SERIALIZEABLE
Hibernate 通過爲 Hibernate 映射文件指定 hibernate.connection.isolation 屬性來設置事務的隔離級別
。
3、clear()
作用:清除緩存。