標籤:
緩衝(Cache): 電腦領域非常通用的概念。它介於應用程式和永久性資料存放區源(如硬碟上的檔案或者資料庫)之間,其作用是降低應用程式直接讀寫永久性資料存放區源的頻率,從而提高應用的運行效能。緩衝中的資料是資料存放區源中資料的拷貝。緩衝的物理介質通常是記憶體;
Hibernate中提供了兩個層級的緩衝
第一層級的緩衝是 Session 層級的緩衝,它是屬於事務範圍的緩衝。這一層級的緩衝由 hibernate 管理的
第二層級的緩衝是 SessionFactory 層級的緩衝,它是屬於進程範圍的緩衝
SessionFactory 的緩衝可以分為兩類:
內建緩衝: Hibernate 內建的, 不可卸載. 通常在 Hibernate 的初始化階段, Hibernate 會把映射中繼資料和預定義的 SQL 陳述式放到 SessionFactory 的緩衝中, 映射中繼資料是對應檔中資料(.hbm.xml 檔案中的資料)的複製. 該內建緩衝是唯讀.
外置緩衝(二級緩衝): 一個可配置的快取區外掛程式. 在預設情況下, SessionFactory 不會啟用這個快取區外掛程式. 外置緩衝中的資料是資料庫資料的複製, 外置緩衝的物理介質可以是記憶體或硬碟
適合放入二級緩衝中的資料: 很少被修改 不是很重要的資料, 允許出現偶爾的並發問題
不適合放入二級緩衝中的資料: 經常被修改 財務資料, 絕對不允許出現並發問題 與其他應用程式共用的資料
1. 使用 Hibernate 二級緩衝的步驟:1). 加入二級快取區外掛程式的 jar 包及設定檔:I. 複製 \hibernate-release-4.2.4.Final\lib\optional\ehcache\*.jar 到當前 Hibrenate 應用的類路徑下.II. 複製 hibernate-release-4.2.4.Final\project\etc\ehcachexml 到當前 WEB 應用的類路徑下2). 配置 hibernate.cfg.xml I. 配置啟用 hibernate 的二級緩衝<property name="cache.use_second_level_cache">true</property>II. 配置hibernate二級緩衝使用的產品<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>III. 配置對哪些類使用 hibernate 的二級緩衝<class-cache usage="read-write" class="com.atguigu.hibernate.entities.Employee"/> 實際上也可以在 .hbm.xml 檔案中配置對哪些類使用二級緩衝, 及二級緩衝的策略是什麼. 2). 集合層級的二級緩衝的配置I. 配置對集合使用二級緩衝<collection-cache usage="read-write" collection="com.atguigu.hibernate.entities.Department.emps"/>也可以在 .hbm.xml 檔案中進行配置<set name="emps" table="GG_EMPLOYEE" inverse="true" lazy="true"> <cache usage="read-write"/> <key> <column name="DEPT_ID" /> </key> <one-to-many class="com.atguigu.hibernate.entities.Employee" /></set>II. 注意: 還需要配置集合中的元素對應的持久化類也使用二級緩衝! 否則將會多出 n 條 SQL 陳述式. 3). ehcache 的 設定檔: ehcache.xml<ehcache> <!-- 指定一個目錄:當 EHCache 把資料寫到硬碟上時, 將把資料寫到這個目錄下. --> <diskStore path="d:\\tempDirectory"/> <!-- 設定緩衝的預設資料到期策略 --> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" /> <!-- 設定具體的具名快取的資料到期策略。每個具名快取代表一個快取區域 快取區域(region):一個具有名稱的緩衝塊,可以給每一個緩衝塊設定不同的緩衝策略。 如果沒有設定任何的快取區域,則所有被緩衝的對象,都將使用預設的緩衝策略。即:<defaultCache.../> Hibernate 在不同的快取區域儲存不同的類/集合。 對於類而言,地區的名稱是類名。如:com.atguigu.domain.Customer 對於集合而言,地區的名稱是類名加屬性名稱。如com.atguigu.domain.Customer.orders --> <!-- name: 設定緩衝的名字,它的取值為類的全限定名或類的集合的名字 maxElementsInMemory: 設定基於記憶體的緩衝中可存放的對象最大數目 eternal: 設定對象是否為永久的, true表示永不到期, 此時將忽略timeToIdleSeconds 和 timeToLiveSeconds屬性; 預設值是false timeToIdleSeconds:設定對象空閑最長時間,以秒為單位, 超過這個時間,對象到期。 當對象到期時,EHCache會把它從緩衝中清除。如果此值為0,表示對象可以無限期地處於空閑狀態。 timeToLiveSeconds:設定對象生存最長時間,超過這個時間,對象到期。 如果此值為0,表示對象可以無限期地存在於緩衝中. 該屬性值必須大於或等於 timeToIdleSeconds 屬性值 overflowToDisk:設定基於記憶體的緩衝中的對象數目達到上限後,是否把溢出的對象寫到基於硬碟的緩衝中 --> <cache name="com.atguigu.hibernate.entities.Employee" maxElementsInMemory="1" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true" /> <cache name="com.atguigu.hibernate.entities.Department.emps" maxElementsInMemory="1000" eternal="true" timeToIdleSeconds="0" timeToLiveSeconds="0" overflowToDisk="false" /></ehcache>4). 查詢快取: 預設情況下, 設定的緩衝對 HQL 及 QBC 查詢時無效的, 但可以通過以下方式使其是有效I. 在 hibernate 設定檔中聲明開啟查詢快取<property name="cache.use_query_cache">true</property>II. 調用 Query 或 Criteria 的 setCacheable(true) 方法III. 查詢快取依賴於二級緩衝
hibernate的二級緩衝