hibernate的二级缓存
緩存(Cache): 計(jì)算機(jī)領(lǐng)域非常通用的概念。它介于應(yīng)用程序和永久性數(shù)據(jù)存儲(chǔ)源(如硬盤(pán)上的文件或者數(shù)據(jù)庫(kù))之間,其作用是降低應(yīng)用程序直接讀寫(xiě)永久性數(shù)據(jù)存儲(chǔ)源的頻率,從而提高應(yīng)用的運(yùn)行性能。緩存中的數(shù)據(jù)是數(shù)據(jù)存儲(chǔ)源中數(shù)據(jù)的拷貝。緩存的物理介質(zhì)通常是內(nèi)存;
Hibernate中提供了兩個(gè)級(jí)別的緩存
第一級(jí)別的緩存是 Session 級(jí)別的緩存,它是屬于事務(wù)范圍的緩存。這一級(jí)別的緩存由 hibernate 管理的
第二級(jí)別的緩存是 SessionFactory 級(jí)別的緩存,它是屬于進(jìn)程范圍的緩存
SessionFactory 的緩存可以分為兩類:
內(nèi)置緩存: Hibernate 自帶的, 不可卸載. 通常在 Hibernate 的初始化階段, Hibernate 會(huì)把映射元數(shù)據(jù)和預(yù)定義的 SQL 語(yǔ)句放到 SessionFactory 的緩存中, 映射元數(shù)據(jù)是映射文件中數(shù)據(jù)(.hbm.xml 文件中的數(shù)據(jù))的復(fù)制. 該內(nèi)置緩存是只讀的.
外置緩存(二級(jí)緩存): 一個(gè)可配置的緩存插件. 在默認(rèn)情況下, SessionFactory 不會(huì)啟用這個(gè)緩存插件. 外置緩存中的數(shù)據(jù)是數(shù)據(jù)庫(kù)數(shù)據(jù)的復(fù)制, 外置緩存的物理介質(zhì)可以是內(nèi)存或硬盤(pán)
適合放入二級(jí)緩存中的數(shù)據(jù): 很少被修改 不是很重要的數(shù)據(jù), 允許出現(xiàn)偶爾的并發(fā)問(wèn)題
不適合放入二級(jí)緩存中的數(shù)據(jù): 經(jīng)常被修改 財(cái)務(wù)數(shù)據(jù), 絕對(duì)不允許出現(xiàn)并發(fā)問(wèn)題 與其他應(yīng)用程序共享的數(shù)據(jù)
1. 使用 Hibernate 二級(jí)緩存的步驟:1). 加入二級(jí)緩存插件的 jar 包及配置文件:I. 復(fù)制 \hibernate-release-4.2.4.Final\lib\optional\ehcache\*.jar 到當(dāng)前 Hibrenate 應(yīng)用的類路徑下. II. 復(fù)制 hibernate-release-4.2.4.Final\project\etc\ehcachexml 到當(dāng)前 WEB 應(yīng)用的類路徑下2). 配置 hibernate.cfg.xml I. 配置啟用 hibernate 的二級(jí)緩存 <property name="cache.use_second_level_cache">true</property>II. 配置hibernate二級(jí)緩存使用的產(chǎn)品 <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>III. 配置對(duì)哪些類使用 hibernate 的二級(jí)緩存 <class-cache usage="read-write" class="com.atguigu.hibernate.entities.Employee"/>實(shí)際上也可以在 .hbm.xml 文件中配置對(duì)哪些類使用二級(jí)緩存, 及二級(jí)緩存的策略是什么. 2). 集合級(jí)別的二級(jí)緩存的配置I. 配置對(duì)集合使用二級(jí)緩存<collection-cache usage="read-write" collection="com.atguigu.hibernate.entities.Department.emps"/>也可以在 .hbm.xml 文件中進(jìn)行配置<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. 注意: 還需要配置集合中的元素對(duì)應(yīng)的持久化類也使用二級(jí)緩存! 否則將會(huì)多出 n 條 SQL 語(yǔ)句. 3). ehcache 的 配置文件: ehcache.xml <ehcache><!-- 指定一個(gè)目錄:當(dāng) EHCache 把數(shù)據(jù)寫(xiě)到硬盤(pán)上時(shí), 將把數(shù)據(jù)寫(xiě)到這個(gè)目錄下.--> <diskStore path="d:\\tempDirectory"/><!-- 設(shè)置緩存的默認(rèn)數(shù)據(jù)過(guò)期策略 --> <defaultCachemaxElementsInMemory="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="true"/><!-- 設(shè)定具體的命名緩存的數(shù)據(jù)過(guò)期策略。每個(gè)命名緩存代表一個(gè)緩存區(qū)域緩存區(qū)域(region):一個(gè)具有名稱的緩存塊,可以給每一個(gè)緩存塊設(shè)置不同的緩存策略。如果沒(méi)有設(shè)置任何的緩存區(qū)域,則所有被緩存的對(duì)象,都將使用默認(rèn)的緩存策略。即:<defaultCache.../>Hibernate 在不同的緩存區(qū)域保存不同的類/集合。對(duì)于類而言,區(qū)域的名稱是類名。如:com.atguigu.domain.Customer對(duì)于集合而言,區(qū)域的名稱是類名加屬性名。如com.atguigu.domain.Customer.orders--><!-- name: 設(shè)置緩存的名字,它的取值為類的全限定名或類的集合的名字 maxElementsInMemory: 設(shè)置基于內(nèi)存的緩存中可存放的對(duì)象最大數(shù)目 eternal: 設(shè)置對(duì)象是否為永久的, true表示永不過(guò)期,此時(shí)將忽略timeToIdleSeconds 和 timeToLiveSeconds屬性; 默認(rèn)值是false timeToIdleSeconds:設(shè)置對(duì)象空閑最長(zhǎng)時(shí)間,以秒為單位, 超過(guò)這個(gè)時(shí)間,對(duì)象過(guò)期。當(dāng)對(duì)象過(guò)期時(shí),EHCache會(huì)把它從緩存中清除。如果此值為0,表示對(duì)象可以無(wú)限期地處于空閑狀態(tài)。 timeToLiveSeconds:設(shè)置對(duì)象生存最長(zhǎng)時(shí)間,超過(guò)這個(gè)時(shí)間,對(duì)象過(guò)期。如果此值為0,表示對(duì)象可以無(wú)限期地存在于緩存中. 該屬性值必須大于或等于 timeToIdleSeconds 屬性值 overflowToDisk:設(shè)置基于內(nèi)存的緩存中的對(duì)象數(shù)目達(dá)到上限后,是否把溢出的對(duì)象寫(xiě)到基于硬盤(pán)的緩存中 --><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). 查詢緩存: 默認(rèn)情況下, 設(shè)置的緩存對(duì) HQL 及 QBC 查詢時(shí)無(wú)效的, 但可以通過(guò)以下方式使其是有效的I. 在 hibernate 配置文件中聲明開(kāi)啟查詢緩存<property name="cache.use_query_cache">true</property>II. 調(diào)用 Query 或 Criteria 的 setCacheable(true) 方法III. 查詢緩存依賴于二級(jí)緩存?
轉(zhuǎn)載于:https://www.cnblogs.com/lxnlxn/p/5912597.html
總結(jié)
以上是生活随笔為你收集整理的hibernate的二级缓存的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 博客园公式编辑相关
- 下一篇: docker 容器日志集中 ELK +