1. 程式人生 > >Hibernate的快取機制

Hibernate的快取機制

        Hibernate中提供了兩級快取,分別是一級快取和二級快取,第一級別的快取是session級別的快取,它是屬於事務範圍的快取,這一級別的快取由Hibernate管理,一般情況下無需進行干預;第二級別的快取是SessionFactory級別的快取,它是屬於程序範圍或群集範圍的快取,又可以分為內建快取和外接快取,這一級別的快取可以進行配置和更改,並且可以動態載入和解除安裝。

一級快取和二級快取的含義

        快取是介於應用程式和物理資料來源之間,其作用是為了降低應用程式對物理資料來源訪問的頻次,從而提高了應用的執行效能。快取中的資料是對物理資料來源中資料的複製,應用程式在執行時從快取讀取資料,在特定的時刻或事件會同步快取和物理資料來源的資料。         一級快取是指session的一些集合屬性包含的資料。二級快取的內建快取中存放了對映元資料和預定義SQL語句,對映元資料是對映檔案中資料的複製,而預定義SQL語句是在Hhibernate初始化階段根據對映元資料推匯出來的,二級快取的內建快取是隻讀的,應用程式不能修改快取中的對映元資料和預定義SQL語句,因此二級快取不需要進行內建快取與對映檔案的同步。

快取的使用範圍

        快取的範圍決定了快取的生命週期以及可以被誰訪問。快取的範圍分為以下3類。         1、事務範圍:快取只能被當前事務訪問,每個事務都有獨自的快取,快取內的資料通常採用相互關聯的物件形式。         2、程序範圍:快取被程序內的所有事務共享。這些事務有可能是併發訪問快取,因此必須對快取採取必要的事務隔離機制。程序範圍的快取可能會存放大量的資料,所以存放的介質可以是記憶體或硬碟。快取內的資料既可以是相互關聯的物件形式,也可以是物件的鬆散資料形式。         3、叢集範圍:在叢集範圍中,快取被一臺機器或者多臺機器的程序共享。快取中的資料被複制到叢集環境中的每個程序節點,程序間通過遠端通訊來保證快取中資料的一致性,快取中的資料通常採用物件的鬆散資料形式。

一級快取和二級快取的區別

1、存放資料的形式不同:一級快取的資料是相互關聯的持久化物件;二級快取存放的資料是物件的散裝資料。 2、快取的範圍不同:一級快取範圍是事務範圍,二級快取範圍是程序範圍或叢集範圍。 3、併發訪問策略不同:由於每個事務都擁有單獨的一級快取,所以無需提供併發訪問策略;由於二級快取被同一個程序或叢集範圍內的所有事務共享,必須提供適當的併發訪問策略,來保證特定的事務隔離級別。 4、資料過期策略不同:一級快取沒有提供資料過期策略,二級快取必須提供資料過期策略,如基於記憶體的快取中的物件的最大數目、允許物件處於快取中的最長時間以及允許物件處於快取中的最長空間時間等。 5、物理儲存介質不同:一級快取的物理儲存介質是記憶體,二級快取的物理儲存介質是記憶體和硬碟。 6、快取的軟體實現不同:在Hibernate的一級快取通過session來實現快取;Hibernate的二級快取由第三方提供(即SessionFactory),Hibernate僅提供了快取介面卡(CacheProvider),用於把特定的快取外掛整合到Hibernate中。 7、啟用快取的方式不同:當應用程式通過session介面來執行儲存、更新、刪除、載入和查詢資料庫資料的操作時,Hibernate就會啟用一級快取。如果類的例項被經常讀但很少被修改,就可以考慮使用第二級快取。只有為某個類或集合配置了第二級快取,Hibernate執行時才會把它的例項加入到第二級快取中。 8、使用者管理快取的方式不同:一級快取的物理介質為記憶體,由於記憶體容量有限,必須通過恰當的檢索策略和檢索方式來限制載入物件的數目。管理二級快取主要包括兩個方面,一是選擇需要使用的第二級快取的持久類,設定合適的併發訪問策略;二是選擇快取介面卡,設定合適的資料過期策略。

一級快取的管理

session為應用程式提供了以下兩個管理快取的方法: 1、evict(Object obj):該方法用於從快取中清除引數指定的持久化物件。 2、clear():該方法用於清空快取中所有持久化物件。