03-Hibernate的Session緩存(一級緩存)

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 的配置文件中可以顯式的設置隔離級別. 每一個隔離級別都對應一個整數:

  1. READ UNCOMMITED
  2. READ COMMITED
  3. REPEATABLE READ
  4. SERIALIZEABLE

  Hibernate 通過爲 Hibernate 映射文件指定 hibernate.connection.isolation 屬性來設置事務的隔離級別

3、clear()

  作用:清除緩存。

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章