1. 程式人生 > >Hibernate入門(三)之hibernate 的session的快取機制

Hibernate入門(三)之hibernate 的session的快取機制

session快取

快取的生命週期

當開啟session以後,該快取就開始了,當session關閉以後,該快取不存在,其生命週期和session的生命週期是一樣的

如何將資料存放到快取中

get方法
session.get方法可以把一個物件放入到session的快取中,以主鍵標識該物件,所以我們把這樣的主鍵也叫oid

save方法

Session.save方法可以把物件放入到快取中

update方法

session.update方法把物件放入到了session快取中

如何測試快取中是否有資料

這裡寫圖片描述

說明:可以利用session.getStatistics()方法統計出放入到session快取中的物件的個數

如何清除快取中的資料

clear方法(清除所有的快取資料)

這裡寫圖片描述

evict方法(清除指定的快取資料)

這裡寫圖片描述

close方法(清除所有的快取資料)

session關閉,快取也就不存在了,session中的資料也就被清除了

不同的session

這裡寫圖片描述
說明:
103行的程式碼中的session和107行程式碼中的session是完全不一樣的
也就是說每次用factory.opensession這個session都是不一樣的

如何將資料庫中的資料同步到快取中

這裡寫圖片描述

當執行117行程式碼的時候,發出了sql語句 session.get方法
當執行119行程式碼的時候,又發出了sql語句 session.refresh
把資料庫中的資料同步到快取中

如何將快取中的資料同步到資料庫中

Session.flush方法會去檢查session快取中各個物件的狀態,如果該物件由臨時狀態轉換過來的(沒有主鍵值),則會讓該物件生成一條insert語句,如果該物件有主鍵值,則會對照副本,決定是否發出update語句。當事務提交的時候,如果不顯式的寫session.flush的情況下,這個時候hibernate內部會預設的執行session.flush。

快取的意義1

傳統從資料庫中獲取資料的做法

這裡寫圖片描述
這樣每次獲取一次資料都要從資料庫中獲取,這樣的效率很低下,但如果使用快取機制的話就不一樣了
這裡寫圖片描述

說明:
 在記憶體區域中,有一個物件Map<String,List<T>>,key值為sql語句,value值為該sql語句執行的結果,在客戶端發出一個sql語句:
1、先從map中檢查是否key值和該sql語句一樣
2、如果一樣,則從map提取資料,和資料庫沒有關係
3、客戶端從map中得到相應的資料
4、第二步,如果不一樣,則從資料庫中查詢
5、把查詢出來的結果快取到map中
6、把結果返回到客戶端一份

快取的意義2

這裡寫圖片描述

Session的快取提供了存放物件的容器,在這個容器中可以對物件隨意操作,但是在執行session.flush的時候,hibernate內部會根據每一個物件的狀態來決定發出insert語句還是update語句。這樣在整個過程中,和資料庫只互動一次,通過這樣的方式可以提高效率