日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Hibernate緩存概述

1、Hibernate緩存概述

緩存是介于物理數(shù)據(jù)源與應用程序之間,是數(shù)據(jù)庫數(shù)據(jù)在內(nèi)存中的存放臨時copy的容器,其作用是為了減少應用程序?qū)ξ锢頂?shù)據(jù)源訪問的次數(shù),從而提高了應用的運行性能。

Hibernate在進行讀取數(shù)據(jù)的時候,根據(jù)緩存機制在相應的緩存中查詢,如果在緩存中找到了需要的數(shù)據(jù)(我們把這稱做“緩存命中"),則就直接把命中的數(shù)據(jù)作為結(jié)果加以利用,避免了建立數(shù)據(jù)庫查詢的性能損耗。

2:Hibernate緩存分類

一級緩存(session):內(nèi)部緩存

事務范圍:緩存只能被當前事務訪問。緩存的生命周期依賴于事務的生命周期,當事務結(jié)束時,緩存也就結(jié)束生命周期。

二級緩存(sessionFactory):緩存被應用范圍內(nèi)的所有事務共享。

這些事務有可能是并發(fā)訪問緩存,因此必須對緩存進行更新。

緩存的生命周期依賴于應用的生命周期,應用結(jié)束時,緩存也就結(jié)束了生命周期,二級緩存存在于應用范圍。

集群范圍:在集群環(huán)境中,緩存被一個機器或者多個機器的進程共享。

緩存中的數(shù)據(jù)被復制到集群環(huán)境中的每個進程節(jié)點,進程間通過遠程通信來保證緩存中的數(shù)據(jù)的一致性,緩存中的數(shù)據(jù)通常采用對象的松散數(shù)據(jù)形式,二級緩存也存在與應用范圍。

注意:對大多數(shù)應用來說,應該慎重地考慮是否需要使用集群范圍的緩存,再加上集群范圍還有數(shù)據(jù)同步的問題,所以應當慎用。

多種范圍的緩存處理過程

持久化層可以提供多種范圍的緩存。如果在事務范圍的緩存中沒有查到相應的數(shù)據(jù),

還可以到應用范圍或集群范圍的緩存內(nèi)查詢,如果還是沒有查到,那么只有到數(shù)據(jù)庫中查詢了。

緩存應用的范圍:

修改少,數(shù)量在可以接受的范圍內(nèi)

使用二級緩存的原則:

數(shù)據(jù)不會被第三方修改

同一數(shù)據(jù)系統(tǒng)經(jīng)常引用

數(shù)據(jù)大小在可接受范圍之內(nèi)

關鍵數(shù)據(jù)或不會被并發(fā)更新的數(shù)據(jù)

hibernate引入第三方的緩存組件EHCACHE,下面是具體的實現(xiàn)步驟:

修改hibernate.cfg.xml配置引入ehCache緩存

 
 
 
  1. < hibernate-configuration>
  2. < session-factory>
  3. < property name="hibernate.cache.provider_class">
  4. net.sf.ehcache.hibernate.EhCacheProvider
  5. < /property>
  6. < !--query也支持緩存-->
  7. < property name="hibernate.cache.use_query_cache">true< /property>
  8. < /session-factory>
  9. < /hibernate-configuration>

在src根目錄下加入ehcache.xml文件,具體內(nèi)容如下:

 
 
 
  1. < ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
  2. < defaultCache
  3. maxElementsInMemory="10000"
  4. eternal="false"
  5. timeToIdleSeconds="120"
  6. timeToLiveSeconds="120"
  7. overflowToDisk="true"
  8. />
  9. < /ehcache>

在映射文件中指定緩存同步策略

 
 
 
  1. < class name="com.tenly.bean.Student">
  2. < cache usage="read-write">
  3. < set name="classroom">
  4. < cache usage="read-only">
  5. < /set>
  6. < /class>

usage屬性說明:

read-only:只讀。對于不會發(fā)生改變的數(shù)據(jù),可使用只讀型緩存。

nonstrict-read-write:不嚴格可讀寫緩存。如果應用程序?qū)Σl(fā)訪問下的數(shù)據(jù)同步要求不是很嚴格的話,

而且數(shù)據(jù)更新操作頻率較低。采用本項,可獲得良好的性能。

read-write

對于經(jīng)常被讀但很少修改的數(shù)據(jù),可以采用這種隔離類型,因為它可以防止臟讀這類的并發(fā)問題.

transactional(事物型)

在Hibernate中,事務型緩存必須運行在JTA事務環(huán)境中。

在測試query時,說明其將用二級緩存

query.setCacheable(true);

釋放Hibernate緩存:

一級緩存的釋放

Session.evict(XXX)

將某個特定的對象從內(nèi)部緩存中清除,上述的XXX 為對象的實例名。使用此方法有兩種適用情形,

需要及時釋放對象占用的內(nèi)存維持系統(tǒng)的穩(wěn)定性

是不希望當前Session繼續(xù)運用此對象的狀態(tài)變化來同步更新數(shù)據(jù)庫。

Session.clear()清除所有的一級緩存

二級緩存的釋放

SessionFacatoyr.evict(XXX)

將某個特定的對象從內(nèi)部緩存中清除,上述的XXX 為對象的實例名。使用此方法有兩種適用情形,

需要及時釋放對象占用的內(nèi)存維持系統(tǒng)的穩(wěn)定性

是不希望當前Session繼續(xù)運用此對象的狀態(tài)變化來同步更新數(shù)據(jù)庫。

SessionFactory.clear()清除所有的二級緩存

查詢緩存:

二級緩存策略的一般過程:

Hibernate進行條件查詢的時候,總是發(fā)出一條select * from XXX where …(XXX為 表名,

 類似的語句下文統(tǒng)稱Select SQL)這樣的SQL語句查詢數(shù)據(jù)庫,一次獲得所有的符合條件的數(shù)據(jù)對象。

把獲得的所有數(shù)據(jù)對象根據(jù)ID放入到第二級緩存中。

當Hibernate根據(jù)ID訪問數(shù)據(jù)對象的時候,首先從內(nèi)部緩存中查找,如果在內(nèi)部緩存中查不到就配置二級緩存,

從二級緩存中查;如果還查不到,再查詢數(shù)據(jù)庫,把結(jié)果按照ID放入到緩存。

 添加數(shù)據(jù)、刪除、更新操作時,同時更新二級緩存。這就是Hibernate做批處理的時候效率不高的原因,

 原來是要維護二級緩存消耗大量時間的緣故。

條件查詢的處理過程:

   ***次查找age>20的所有學生信息,然后納入二級緩存。

   第二次我們的查詢條件變了,查找age>15的所有學生信息,顯然***次查詢的結(jié)果完全滿足第二次查詢的條件,

   但并不是滿足條件的全部數(shù)據(jù)。這樣的話,我們就要再做一次查詢得到全部數(shù)據(jù)才行。

   如果我們執(zhí)行的是相同的條件語句,Hibernate引入Query Cache的。

 查詢緩存策略的一般過程:

完全相同的Select SQL重復執(zhí)行。

重復執(zhí)行期間,Query Key對應的數(shù)據(jù)表不能有數(shù)據(jù)變動(比如添、刪、改操作)

啟用Query Cache,我們需要在hibernate.cfg.xml中進行配置,參考配置如下(只列出核心配置項):

 
 
 
  1. < hibernate-configuration>
  2. < session-factory>
  3. < property name="hibernate.cache.user_query_cache">true< /property>
  4. < /session-factory>
  5. < /hibernate-configuration>

在查詢執(zhí)行之前,將Query.Cacheable設置為true,而且每次都應該這樣。比如:

Query query=session.createQuery(hql).setInteger(0.15);

query.setCacheable(true);


網(wǎng)站欄目:Hibernate緩存概述
網(wǎng)頁網(wǎng)址:http://www.5511xx.com/article/dhehsco.html