欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Hibernate緩存機制
 
1.    Cache簡(jiǎn)介:
緩存(Cache )是計算機領(lǐng)域非常通用的概念。它介于應用程序和永久性數據存儲源(如硬盤(pán)上的文件或者數據庫)之間,其作用是降低應用程序直接讀寫(xiě)永久性數據存儲源的頻率,從而提高應用的運行性能。緩存中的數據是數據存儲源中數據的拷貝,應用程序在運行時(shí)直接讀寫(xiě)緩存中的數據,只在某些特定時(shí)刻按照緩存中的數據來(lái)同步更新數據存儲源。
緩存的物理介質(zhì)通常是內存,而永久性數據存儲源的物理介質(zhì)通常是硬盤(pán)或磁盤(pán),應用程序讀寫(xiě)內在的速度顯然比讀寫(xiě)硬盤(pán)的速度快,如果緩存中存放的數據量非常大,也會(huì )用硬盤(pán)作為緩存的物理介質(zhì)。
緩存的實(shí)現不僅需要作為物理介質(zhì)的硬件,同時(shí)還需要用于管理緩存的并發(fā)訪(fǎng)問(wèn)和過(guò)期等策略的軟件。因此,緩存是通過(guò)軟件和硬件共同實(shí)現的。
1.1.    持久化層的緩存的范圍
緩存的范圍決定了緩存的生命周期以及可以被誰(shuí)訪(fǎng)問(wèn)。緩存的范圍分為三類(lèi)。
1) 事務(wù)范圍:緩存只能被當前事務(wù)訪(fǎng)問(wèn)。緩存的生命周期依賴(lài)于事務(wù)的生命周期,當事務(wù)結束時(shí),緩存也就結束生命周期。在此范圍下,緩存的介質(zhì)是內存。事務(wù)可以是數據庫事務(wù)或者應用事務(wù),每個(gè)事務(wù)都有獨自的緩存,緩存內的數據通常采用相互關(guān)聯(lián)的對象形式。
2) 進(jìn)程范圍:緩存被進(jìn)程內的所有事務(wù)共享。這些事務(wù)有可能是并發(fā)訪(fǎng)問(wèn)緩存,因此必須對緩存采取必要的事務(wù)隔離機制。緩存的生命周期依賴(lài)于進(jìn)程的生命周期,進(jìn)程結束時(shí),緩存也就結束了生命周期。進(jìn)程范圍的緩存可能會(huì )存放大量的數據,所以存放的介質(zhì)可以是內存或硬盤(pán)。緩存內的數據既可以是相互關(guān)聯(lián)的對象形式也可以是對象的松散數據形式。松散的對象數據形式有點(diǎn)類(lèi)似于對象的序列化數據,但是對象分解為松散的算法比對象序列化的算法要求更快。
3) 集群范圍:在集群環(huán)境中,緩存被一個(gè)機器或者多個(gè)機器的進(jìn)程共享。緩存中的數據被復制到集群環(huán)境中的每個(gè)進(jìn)程節點(diǎn),進(jìn)程間通過(guò)遠程通信來(lái)保證緩存中的數據的一致性,緩存中的數據通常采用對象的松散數據形式。
對大多數應用來(lái)說(shuō),應該慎重地考慮是否需要使用集群范圍的緩存,因為訪(fǎng)問(wèn)的速度不一定會(huì )比直接訪(fǎng)問(wèn)數據庫數據的速度快多少。
持久化層可以提供多種范圍的緩存。如果在事務(wù)范圍的緩存中沒(méi)有查到相應的數據,還可以到進(jìn)程范圍或集群范圍的緩存內查詢(xún),如果還是沒(méi)有查到,那么只有到數據庫中查詢(xún)。事務(wù)范圍的緩存是持久化層的第一級緩存,通常它是必需的;進(jìn)程范圍或集群范圍的緩存是持久化層的第二級緩存,通常是可選的。
1.2.    持久化層的緩存的并發(fā)訪(fǎng)問(wèn)策略
當多個(gè)并發(fā)的事務(wù)同時(shí)訪(fǎng)問(wèn)持久化層的緩存的相同數據時(shí),會(huì )引起并發(fā)問(wèn)題,必須采用必要的事務(wù)隔離措施。
在進(jìn)程范圍或集群范圍的緩存,即第二級緩存,會(huì )出現并發(fā)問(wèn)題。因此可以設定以下四種類(lèi)型的并發(fā)訪(fǎng)問(wèn)策略,每一種策略對應一種事務(wù)隔離級別。
1) 事務(wù)型(Transactional)策略:僅僅在受管理環(huán)境中適用。它提供了Repeatable Read事務(wù)隔離級別。對于經(jīng)常被讀但很少修改的數據,可以采用這種隔離類(lèi)型,因為它可以防止臟讀和不可重復讀這類(lèi)的并發(fā)問(wèn)題。
2) 讀寫(xiě)型(read-write)策略:提供了Read Committed事務(wù)隔離級別。僅僅在非集群的環(huán)境中適用。對于經(jīng)常被讀但很少修改的數據,可以采用這種隔離類(lèi)型,因為它可以防止臟讀這類(lèi)的并發(fā)問(wèn)題。
3) 非嚴格讀寫(xiě)型(nonstrict-read-write)策略:不保證緩存與數據庫中數據的一致性。如果存在兩個(gè)事務(wù)同時(shí)訪(fǎng)問(wèn)緩存中相同數據的可能,必須為該數據配置一個(gè)很短的數據過(guò)期時(shí)間,從而盡量避免臟讀。對于極少被修改,并且允許偶爾臟讀的數據,可以采用這種并發(fā)訪(fǎng)問(wèn)策略。
4) 只讀型策略(read-only):對于從來(lái)不會(huì )修改的數據,如參考數據,可以使用這種并發(fā)訪(fǎng)問(wèn)策略。
事務(wù)型并發(fā)訪(fǎng)問(wèn)策略是事務(wù)隔離級別最高,只讀型的隔離級別最低。事務(wù)隔離級別越高,并發(fā)性能就越低。
2.    Hibernate中的緩存:
Hibernate中提供了兩級Cache,第一級別的緩存是Session級別的緩存,它是屬于事務(wù)范圍的緩存。這一級別的緩存由hibernate管理的,一般情況下無(wú)需進(jìn)行干預;第二級別的緩存是SessionFactory級別的緩存,它是屬于進(jìn)程范圍或群集范圍的緩存。這一級別的緩存可以進(jìn)行配置和更改,并且可以動(dòng)態(tài)加載和卸載。
Hibernate還為查詢(xún)結果提供了一個(gè)查詢(xún)緩存,它依賴(lài)于第二級緩存。
2.1.    一級緩存和二級緩存的比較:
第一級緩存 第二級緩存
存放數據的形式 相互關(guān)聯(lián)的持久化對象 對象的散裝數據
緩存的范圍 事務(wù)范圍,每個(gè)事務(wù)都有單獨的第一級緩存 進(jìn)程范圍或集群范圍,緩存被同一個(gè)進(jìn)程或集群范圍內的所有事務(wù)共享
并發(fā)訪(fǎng)問(wèn)策略 由于每個(gè)事務(wù)都擁有單獨的第一級緩存,不會(huì )出現并發(fā)問(wèn)題,無(wú)需提供并發(fā)訪(fǎng)問(wèn)策略 由于多個(gè)事務(wù)會(huì )同時(shí)訪(fǎng)問(wèn)第二級緩存中相同數據,因此必須提供適當的并發(fā)訪(fǎng)問(wèn)策略,來(lái)保證特定的事務(wù)隔離級別
數據過(guò)期策略 沒(méi)有提供數據過(guò)期策略。處于一級緩存中的對象永遠不會(huì )過(guò)期,除非應用程序顯式清空緩存或者清除特定的對象 必須提供數據過(guò)期策略,如基于內存的緩存中的對象的最大數目,允許對象處于緩存中的最長(cháng)時(shí)間,以及允許對象處于緩存中的最長(cháng)空閑時(shí)間
物理存儲介質(zhì) 內存 內存和硬盤(pán)。對象的散裝數據首先存放在基于內在的緩存中,當內存中對象的數目達到數據過(guò)期策略中指定上限時(shí),就會(huì )把其余的對象寫(xiě)入基于硬盤(pán)的緩存中。
緩存的軟件實(shí)現 在Hibernate的Session的實(shí)現中包含了緩存的實(shí)現 由第三方提供,Hibernate僅提供了緩存適配器(CacheProvider)。用于把特定的緩存插件集成到Hibernate中。
啟用緩存的方式 只要應用程序通過(guò)Session接口來(lái)執行保存、更新、刪除、加載和查詢(xún)數據庫數據的操作,Hibernate就會(huì )啟用第一級緩存,把數據庫中的數據以對象的形式拷貝到緩存中,對于批量更新和批量刪除操作,如果不希望啟用第一級緩存,可以繞過(guò)Hibernate API,直接通過(guò)JDBC API來(lái)執行指操作。 用戶(hù)可以在單個(gè)類(lèi)或類(lèi)的單個(gè)集合的粒度上配置第二級緩存。如果類(lèi)的實(shí)例被經(jīng)常讀但很少被修改,就可以考慮使用第二級緩存。只有為某個(gè)類(lèi)或集合配置了第二級緩存,Hibernate在運行時(shí)才會(huì )把它的實(shí)例加入到第二級緩存中。
用戶(hù)管理緩存的方式 第一級緩存的物理介質(zhì)為內存,由于內存容量有限,必須通過(guò)恰當的檢索策略和檢索方式來(lái)限制加載對象的數目。Session的evit()方法可以顯式清空緩存中特定對象,但這種方法不值得推薦。 第二級緩存的物理介質(zhì)可以是內存和硬盤(pán),因此第二級緩存可以存放大量的數據,數據過(guò)期策略的maxElementsInMemory屬性值可以控制內存中的對象數目。管理第二級緩存主要包括兩個(gè)方面:選擇需要使用第二級緩存的持久類(lèi),設置合適的并發(fā)訪(fǎng)問(wèn)策略:選擇緩存適配器,設置合適的數據過(guò)期策略。
2.2.    一級緩存的管理:
當應用程序調用Session的save()、update()、savaeOrUpdate()、get()或load(),以及調用查詢(xún)接口的list()、iterate()或filter()方法時(shí),如果在Session緩存中還不存在相應的對象,Hibernate就會(huì )把該對象加入到第一級緩存中。當清理緩存時(shí),Hibernate會(huì )根據緩存中對象的狀態(tài)變化來(lái)同步更新數據庫。
Session為應用程序提供了兩個(gè)管理緩存的方法:
evict(Object obj):從緩存中清除參數指定的持久化對象。
clear():清空緩存中所有持久化對象。
2.3.    二級緩存的管理:
2.3.1.      Hibernate的二級緩存策略的一般過(guò)程如下:
1) 條件查詢(xún)的時(shí)候,總是發(fā)出一條select * from table_name where …. (選擇所有字段)這樣的SQL語(yǔ)句查詢(xún)數據庫,一次獲得所有的數據對象。
2) 把獲得的所有數據對象根據ID放入到第二級緩存中。
3) 當Hibernate根據ID訪(fǎng)問(wèn)數據對象的時(shí)候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那么從二級緩存中查;查不到,再查詢(xún)數據庫,把結果按照ID放入到緩存。
4) 刪除、更新、增加數據的時(shí)候,同時(shí)更新緩存。
Hibernate的二級緩存策略,是針對于ID查詢(xún)的緩存策略,對于條件查詢(xún)則毫無(wú)作用。為此,Hibernate提供了針對條件查詢(xún)的Query Cache。
2.3.2.      什么樣的數據適合存放到第二級緩存中?
1 很少被修改的數據
2 不是很重要的數據,允許出現偶爾并發(fā)的數據
3 不會(huì )被并發(fā)訪(fǎng)問(wèn)的數據
4 參考數據,指的是供應用參考的常量數據,它的實(shí)例數目有限,它的實(shí)例會(huì )被許多其他類(lèi)的實(shí)例引用,實(shí)例極少或者從來(lái)不會(huì )被修改。
2.3.3.      不適合存放到第二級緩存的數據?
1 經(jīng)常被修改的數據
2 財務(wù)數據,絕對不允許出現并發(fā)
3 與其他應用共享的數據。
2.3.4.      常用的緩存插件
Hibernater 的二級緩存是一個(gè)插件,下面是幾種常用的緩存插件:
l EhCache:可作為進(jìn)程范圍的緩存,存放數據的物理介質(zhì)可以是內存或硬盤(pán),對Hibernate的查詢(xún)緩存提供了支持。
l OSCache:可作為進(jìn)程范圍的緩存,存放數據的物理介質(zhì)可以是內存或硬盤(pán),提供了豐富的緩存數據過(guò)期策略,對Hibernate的查詢(xún)緩存提供了支持。
l SwarmCache:可作為群集范圍內的緩存,但不支持Hibernate的查詢(xún)緩存。
l JBossCache:可作為群集范圍內的緩存,支持事務(wù)型并發(fā)訪(fǎng)問(wèn)策略,對Hibernate的查詢(xún)緩存提供了支持。
2.3.5.      配置二級緩存的主要步驟:
1)      選擇需要使用二級緩存的持久化類(lèi),設置它的命名緩存的并發(fā)訪(fǎng)問(wèn)策略。這是最值得認真考慮的步驟。
2)      選擇合適的緩存插件,然后編輯該插件的配置文件。
2.4.    使用EhCache配置二級緩存:
2.4.1.      配置準備:
1)      把ehcache-1.2.3.jar加入到當前應用的classpath中。
2)      在hibernate.cfg.xml文件中加入EhCache緩存插件的提供類(lèi)。
< !--配置緩存插件 -->
< property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
< /property>
3)      挎貝ehcache.xml文件到類(lèi)路徑(項目工程的src目錄下),這個(gè)文件在Hibernate安裝目錄的etc下。
2.4.2.      配置步驟:
Hibernate允許在類(lèi)和集合的粒度上設置第二級緩存。在映射文件中,< class>和< set>元素都有一個(gè)< cache>子元素,這個(gè)子元素用來(lái)配置二級緩存。
示例:以category(產(chǎn)品類(lèi)別)和product(產(chǎn)品)的映射為例:
1)      修改要配置緩存的那個(gè)持久化類(lèi)的對象關(guān)系映射文件:
Category.hbm.xml
< ?xml version="1.0" encoding="utf-8"?>
< !DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
< hibernate-mapping>
< class name="org.qiujy.domain.cachedemo.Category" table="categories">
< !?
配置緩存,必須緊跟在class元素后面
對緩存中的Category對象采用讀寫(xiě)型的并發(fā)訪(fǎng)問(wèn)策略
-->
< cache usage="read-write"/>
< id name="id" type="java.lang.Long">
< column name="id" />
< generator class="native" />
< /id>
< !-- 配置版本號,必須緊跟在id元素后面 -->
< version name="version" column="version" type="java.lang.Long" />
< property name="name" type="java.lang.String">
< column name="name" length="32" not-null="true"/>
< /property>
< property name="description" type="java.lang.String">
< column name="description" length="255"/>
< /property>
< set name="products" table="products" cascade="all" inverse="true">
< !-- Hibernate只會(huì )緩存對象的簡(jiǎn)單屬性的值,
要緩存集合屬性,必須在集合元素中也加入< cache>子元素
而Hibernate僅僅是把與當前持久對象關(guān)聯(lián)的對象的OID存放到緩存中。
如果希望把整個(gè)關(guān)聯(lián)的對象的所有數據都存入緩存,
則要在相應關(guān)聯(lián)的對象的映射文件中配置< cache>元素
-->
< cache usage="read-write"/>
< key column="categoryId" not-null="true"/>
< one-to-many class="org.qiujy.domain.cachedemo.Product"/>
< /set>
< /class>
< /hibernate-mapping>
Product.hbm.xml
< ?xml version="1.0" encoding="utf-8"?>
< !DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
< hibernate-mapping>
< class name="org.qiujy.domain.cachedemo.Product" table="products">
< cache usage="read-write"/>
< id name="id" type="java.lang.Long">
< column name="id" />
< generator class="native" />
< /id>
< !-- 配置版本號,必須緊跟在id元素后面 -->
< version name="version" column="version" type="java.lang.Long" />
< property name="name" type="java.lang.String">
< column name="name" length="32" not-null="true"/>
< /property>
< property name="description" type="java.lang.String">
< column name="description" length="255"/>
< /property>
< property name="unitCost" type="java.lang.Double">
< column name="unitCost" />
< /property>
< property name="pubTime" type="java.util.Date">
< column name="pubTime" not-null="true" />
< /property>
< many-to-one name="category"
column="categoryId"
class="org.qiujy.domain.cachedemo.Category"
cascade="save-update"
not-null="true">
< /many-to-one>
< /class>
< /hibernate-mapping>
2)      編輯ehcache.xml文件:
< ehcache>
< diskStore path="c:\\ehcache\"/>
< defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
< !-- 設置Category類(lèi)的緩存的數據過(guò)期策略 -->
< cache name="org.qiujy.domain.cachedemo.Category"
maxElementsInMemory="100"
eternal="true"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
overflowToDisk="false"
/>
< !-- 設置Category類(lèi)的products集合的緩存的數據過(guò)期策略 -->
< cache name="org.qiujy.domain.cachedemo.Category.products"
maxElementsInMemory="500"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
< cache name="org.qiujy.domain.cachedemo.Product"
maxElementsInMemory="500"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
< /ehcache>
配置的元素說(shuō)明:
元素或屬性 描述
< diskStore> 設置緩存數據文件的存放目錄
< defaultCache> 設置緩存的默認數據過(guò)期策略
< cache> 設定具體的命名緩存的數據過(guò)期策略
每個(gè)命名緩存代表一個(gè)緩存區域,每個(gè)緩存區域有各自的數據過(guò)期策略。命名緩存機制使得用戶(hù)能夠在每個(gè)類(lèi)以及類(lèi)的每個(gè)集合的粒度上設置數據過(guò)期策略。
cache元素的屬性
name 設置緩存的名字,它的取值為類(lèi)的全限定名或類(lèi)的集合的名字
maxInMemory 設置基于內存的緩存中可存放的對象最大數目
eternal 設置對象是否為永久的,true表示永不過(guò)期,此時(shí)將忽略timeToIdleSeconds和timeToLiveSeconds屬性;
默認值是false
timeToIdleSeconds 設置對象空閑最長(cháng)時(shí)間,超過(guò)這個(gè)時(shí)間,對象過(guò)期。當對象過(guò)期時(shí),EHCache會(huì )把它從緩存中清除。
如果此值為0,表示對象可以無(wú)限期地處于空閑狀態(tài)。
timeToLiveSeconds 設置對象生存最長(cháng)時(shí)間,超過(guò)這個(gè)時(shí)間,對象過(guò)期。
如果此值為0,表示對象可以無(wú)限期地存在于緩存中。
overflowToDisk 設置基于內在的緩存中的對象數目達到上限后,是否把溢出的對象寫(xiě)到基于硬盤(pán)的緩存中
3)      寫(xiě)一測試類(lèi):
package org.qiujy.test.cache;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.qiujy.common.HibernateSessionFactory;
import org.qiujy.domain.cachedemo.Product;
public class TestCache {
public static void main(String[] args) {
//test cache.........
Session session2 = HibernateSessionFactory.getSession();
Transaction tx2 =null;
try{
tx2 = session2.beginTransaction();
List list = session2.createQuery("from Product").list();
for(int i = 0 ; i <  list.size(); i++){
Product prod = (Product)list.get(i);
System.out.println(prod.getName());
}
tx2.commit();
}catch(HibernateException e){
if(tx2 != null){
tx2.rollback();
}
e.printStackTrace();
}finally{
HibernateSessionFactory.closeSession();
}
//-------------------
Session session3 = HibernateSessionFactory.getSession();
Transaction tx3 =null;
try{
tx3 = session3.beginTransaction();
Product prod = (Product)session3.get(Product.class, new Long(1));
System.out.println("從cache中得到,不執行SQL---" + prod.getName());
tx3.commit();
}catch(HibernateException e){
if(tx3 != null){
tx3.rollback();
}
e.printStackTrace();
}finally{
HibernateSessionFactory.closeSession();
}
}
}
首先數據庫插入1000條產(chǎn)品記錄和1條類(lèi)別記錄。此1000個(gè)產(chǎn)品都屬于這一類(lèi)別。然后執行以上測試類(lèi),在Session2中查詢(xún)所有的產(chǎn)品,輸出它的產(chǎn)品名,Session2會(huì )把這些數據加載到二級緩存中,由于有1000個(gè)對象,而配置中定義內存中只能存放500個(gè),剩下的對象就會(huì )寫(xiě)到指定的磁盤(pán)目錄中緩存起來(lái)。所以在磁盤(pán)相應位置可看到數據文件:
2.5.    查詢(xún)緩存(Query Cache):
對于經(jīng)常使用的查詢(xún)語(yǔ)句,如果啟用了查詢(xún)緩存,當第一次執行查詢(xún)語(yǔ)句時(shí),Hibernate會(huì )把查詢(xún)結果存放在第二緩存中。以后再次執行該查詢(xún)語(yǔ)句時(shí),只需從緩存中獲得查詢(xún)結果,從而提高查詢(xún)性能。
2.5.1.      查詢(xún)緩存適用于以下場(chǎng)合:
l 在應用程序運行時(shí)經(jīng)常使用的查詢(xún)語(yǔ)句。
l 很少對與查詢(xún)語(yǔ)句關(guān)聯(lián)的數據庫數據進(jìn)行插入、刪除或更新操作。
2.5.2.      Hibernate的Query緩存策略的過(guò)程如下:
1) Hibernate首先根據這些信息組成一個(gè)Query Key,Query Key包括條件查詢(xún)的請求一般信息:SQL, SQL需要的參數,記錄范圍(起始位置rowStart,最大記錄個(gè)數maxRows),等。
2) Hibernate根據這個(gè)Query Key到Query緩存中查找對應的結果列表。如果存在,那么返回這個(gè)結果列表;如果不存在,查詢(xún)數據庫,獲取結果列表,把整個(gè)結果列表根據Query Key放入到Query緩存中。
3) Query Key中的SQL涉及到一些表名,如果這些表的任何數據發(fā)生修改、刪除、增加等操作,這些相關(guān)的Query Key都要從緩存中清空。
只有當經(jīng)常使用同樣的參數進(jìn)行查詢(xún)時(shí),這才會(huì )有些用處。
啟用查詢(xún)緩存的步驟:
1)      配置二級緩存:
Hibernate提供了三種和查詢(xún)相關(guān)的緩存區域:
l 默認的查詢(xún)緩存區域:org.hibernate.cache.StandardQueryCache
l 用戶(hù)自定義的查詢(xún)緩存區域:
l 時(shí)間戳緩存區域:org.hibernate.cache.UpdateTimestampCache
默認的查詢(xún)緩存區域以及用戶(hù)自定義的查詢(xún)緩存區域都用于存放查詢(xún)結果。而時(shí)間戳緩存區域存放了對與查詢(xún)結果相關(guān)的表進(jìn)行插入、更新或刪除操作的時(shí)間戳。Hibernate通過(guò)時(shí)間戳緩存區域來(lái)判斷被緩存的查詢(xún)結果是否過(guò)期。所以,當應用程序對數據庫的相關(guān)數據做了修改,Hibernate會(huì )自動(dòng)刷新緩存的查詢(xún)結果。但是如果其他應用程序對數據庫的相關(guān)數據做了修改,則無(wú)法監測,此時(shí)必須由應用程序負責監測這一變化,然后手工刷新查詢(xún)結果。Query接口的setForceCacheRefresh(true)可以手工刷新查詢(xún)結果。
在ehcache.xml中添加如下配置:
< !-- 設置默認的查詢(xún)緩存的數據過(guò)期策略 -->
< cache name="org.hibernate.cache.StandardQueryCache"
maxElementsInMemory="50"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="7200"
overflowToDisk="true"/>
< !-- 設置時(shí)間戳緩存的數據過(guò)期策略 -->
< cache name="org.hibernate.cache.UpdateTimestampsCache"
maxElementsInMemory="5000"
eternal="true"
overflowToDisk="true"/>
< !-- 設置自定義命名查詢(xún)緩存customerQueries的數據過(guò)期策略 -->
< cache name="myCacheRegion"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
2)      打開(kāi)查詢(xún)緩存:在hibernate.cfg.xml添加如下配置
< !--啟用查詢(xún)緩存 -->
< property name="cache.use_query_cache">true< /property>
3)      在程序中使用:
雖然按以上設置好了查詢(xún)緩存,但Hibernate在執行查詢(xún)語(yǔ)句語(yǔ)句時(shí)仍不會(huì )啟用查詢(xún)緩存。對于希望啟用查詢(xún)緩存的查詢(xún)語(yǔ)句,應該調用Query接口的setCacheeable(true)方法:
測試類(lèi)如下:
package org.qiujy.test.cache;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.qiujy.common.HibernateSessionFactory;
import org.qiujy.domain.cachedemo.Product;
public class TessQueryCache {
public static void main(String[] args) {
Session session = HibernateSessionFactory.getSession();
Transaction tx =null;
try{
tx = session.beginTransaction();
Query query = session.createQuery("from Product");
//激活查詢(xún)緩存
query.setCacheable(true);
//使用自定義的查詢(xún)緩存區域,若不設置,則使用標準查詢(xún)緩存區域
query.setCacheRegion("myCacheRegion");
List list = query.list();
for(int i = 0 ; i <  list.size(); i++){
Product prod = (Product)list.get(i);
System.out.println(prod.getName());
}
tx.commit();
}catch(HibernateException e){
if(tx != null){
tx.rollback();
}
e.printStackTrace();
}finally{
HibernateSessionFactory.closeSession();
}
}
}
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
hibernate3-二級緩存配制 EHCache實(shí)戰
全面講解Hibernate二級緩存
Hibernate二級緩存
Hibernate緩存何時(shí)使用和如何使用
Hibernate 二級緩存 總結整理
談?wù)凥ibernate緩存使用(一)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久