成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Hibernate中的Cache管理

開發 后端
本文向您介紹Hibernate Cache管理方法,對Hibernate中的一級Cache和二級Cache做出詳細介紹和講解。

Hibernate實現了良好的Cache機制,可以借助Hibernate內部的Cache迅速提高系統的數據讀取性能。Hibernate中的Cache可分為兩層:一級Cache和二級Cache。

一級Cache:

Session實現了第一級Hibernate Cache,它屬于事務級數據緩沖。一旦事務結束,這個Cache也隨之失效。一個Session的生命周期對應一個數據庫事務或一個程序事務。

Session-cache保證了一個Session中兩次請求同一個對象時,取得的對象是同一個JAVA實例,有時它可以避免不必要的數據沖突。另外,它還能為另一些重要的性能提供保證:

1:在對一個對象進行自我循環引用時, 不至于產生堆棧溢出。

2:當數據庫事務結束時,對于同一個數據庫行,不會產生數據沖突,因為對于數據庫中的一行,最多只有一個對象來表示它。

3:一個事務中可能會有很多個處理單元,在每一個處理單元中做的操作都會立即被另外的處理單元得知。

我們不用刻意去打開Session-cache,它總是被打開并且不能被關閉。當使用save(),update()或saveOrUpdate()來保存數據更改,或通過load(),find(),list()等方法來得到對象時,對象就會被加入到Session-cache。

如果要同步很多數據對象,就需要有效地管理Cache,可以用Session的evict()方法從一級Cache中移除對象。如下:

  1. Session session = HibernateUtil.currentSession();  
  2. Transaction tx = session.beginTransaction();  
  3. for(int i = 0 ; i <100000 ; i++)  
  4. {  
  5.     Student stu = new Student();  
  6.       
  7.     session.save(stu);  
  8. }  
  9. tx.commit();  

session.close();在保存50000個或更多對象時,程序可能會拋出OutOfMemoryException異常,因為Hibernate Cache在一級緩存了新加入的所有對象。內存溢出。要解決這全問題就需要把JDBC批處理數量設置為一個合理的數值(一般是10~20)。在Hibernate Cache的配置文件中可以加入以下屬性

<property name="hibernate.jdbc.batch_size"> 20 </property>

然后我們在程序中一定時刻就提交并更新Session的Hibernate Cache:

  1. Session session = HibernateUtil.currentSession();  
  2. Transaction tx = session.beginTransaction();  
  3. for(int i = 0 ; i <100000 ; i++)  
  4. {  
  5.     Student stu = new Student();  
  6.       
  7.     session.save(stu);  
  8.     if(i%20 == 0)    //每保存完20個對象后,進行如下操作  
  9.     {  
  10.         session.flush();//這個會提交更新  
  11.         session.clear();//清除Cache,釋放內存  
  12.     }  
  13. }  

二級Cache

二級Cache是SessionFactory范圍內的緩存,所有的Session共享同一個二級Cache。在二級Cache中保存持久性實例的散裝形式的數據。二級Cache的內部如何實現并不重要,重要的是采用哪種正確的緩存策略,以及采用哪個Cache提供器。持久化不同的數據需要不同的Cache策略,比如一些因素將影響到Cache策略的選擇:數據的讀/寫比例,數據表是否能被其他的應用程序揚訪問等。對于一些讀/寫比例高的數據可以打開它的緩存,允許這些數據進入二級緩存容器有利于系統性能的優化;而對于能被其它應用程序訪問的數據對象,最好將此對象的二級Cache選項關閉。

設置Hibernate Cache的二級需要分兩步進行:首先確認使用什么數據并發策略,然后配置緩存過期時間并設置Hibernate Cache提供器。

有4種內置的Hibernate數據并發沖突策略,代表數據庫隔離級別,如下:

1:事務(Transaction)僅在受管理的環境中可用。它保證可重讀的事務隔離級別,可以對讀/寫比例高,很少更新的數據采用該策略。

2:讀寫(read-write)使用時間戳機制維護讀寫提交事務隔離級別。可以對讀/寫比例高,很少更新的數據采用該策略。

3:非嚴格讀寫(notstrict-read-write)不保證Cache和數據庫之間的數據庫的一致性。使用此策略時,應該設置足夠的緩存過期時間,否則可能從緩存中讀出臟數據。當一些數據極少改變,并且當這些數據和數據庫有一部份不量影響不大時,可以使用此策略。

4:只讀(read-only)當確保數據永不改變時,可以使用此策略。

我們確定了Hibernate Cache策略后,就要挑選一個高效的Cache提供器,它將作為插件被Hibernate調用。Hibernate允許使用下述幾種緩存插件:
EhCache:可以在JVM中作為一個簡單進程范圍內的緩存,它可以把緩存的數據放入內存或磁盤,并支持Hibernate中可選用的查詢緩存。
OpenSymphony OSCache:和EhCache相似,并且提供了豐富的緩存過期策略。

◆SwarmCache:可作為集群范圍的緩存,但不支持查詢緩存。

◆JBossCache:可作為集群范圍的緩沖,但不支持查詢緩存。

在Hibernate中使用EhCache

EhCache是一個純JAVA程序,可以在Hibernate中作為一個插件引入。在Hibernate中使用EhCache需要在Hibernate的配置文件中設置如下:

  1. <propery name="hibernate.cache.provider_class"> 
  2.     org.hibernate.cache.EhCacheProvider  
  3. </property>  
  4. <ehcache> 
  5.     <diskStore path="c:\\cache"/>    //設置cache.data文件存放位置  
  6.  
  7.     <defaultCache 
  8.            maxElementsInMemory="10000" //緩存中允許創建的最大對象數  
  9.            eternal="false"    //緩存中對象是否為永久的  
  10.            timeToIdleSeconds="120"//緩存數據鈍化時間(即對象在它過期前的空閑時間)  
  11.            timeToLiveSeconds="120"//緩存數據生存時間(即對象在它過期前的生存時間)  
  12.            overflowToDisk="true" 
  13.     /> 
  14.       
  15.     <cache name="Student"    //用戶自定義的Cache配置  
  16.            maxElementsInMemory="10000" 
  17.            eternal="false" 
  18.            timeToIdleSeconds="300" 
  19.            timeToLiveSeconds="600" 
  20.            overflowToDisk="true" 
  21.                  /> 
  22. </ehcache> 

此外我們還需要在持久化類的映射文件中進行配置。例如,Group(班級)和Student(學生)是一對多的關系,它們對應的數據表分別是t_group和t_student。現在要把Student類的數據進行二級緩存,這需要在二個映射文件中都對二級緩存進行配置。

在Group.hbm.xml中如下,在其<set></set>中添加

<cache usage="read-write"/><!--集合中的數據被緩存-->上述文件雖然在<set>標記中設置了<cache usage="read-write"/>,但Hibernate只是把Group相關的Student的主鍵ID加入到緩存中,如果希望把整個Student的散裝屬性都加入到二級緩存中,還需要在Student.hbm.xml文件的<class>標記中添加<cache>子標記。如下:

  1. <class name="Student" table="t_student"> 
  2.     <cache usage="read-write" /><!--cache標記需跟在class標記后--> 
  3. </class> 

 

【編輯推薦】

  1. Hibernate數據加載方式淺析
  2. Hibernate實體對象的生命周期
  3. Hibernate臟數據與數據緩存
  4. Hibernate緩存機制探討
  5. Hibernate查詢方法與緩存的關系
責任編輯:佚名 來源: JavaeEye
相關推薦

2009-09-22 10:50:04

Hibernate c

2009-06-29 09:00:42

Hibernate的Q

2009-09-21 17:09:38

Hibernate C

2009-09-21 17:17:11

Hibernate二級

2009-06-03 10:20:11

Hibernate事務管理配置

2009-06-18 10:07:03

CriteriaHibernate

2009-06-26 16:15:04

Criteria的用法Hibernate

2009-09-23 10:19:08

Hibernate分頁

2009-09-25 10:25:54

Hibernate緩存

2009-06-30 14:08:00

Hibernate緩存

2009-09-22 15:26:30

Hibernate多表

2009-06-29 08:59:05

hbm的generat

2009-06-17 14:17:40

Criteria條件查Hibernate

2009-06-26 10:19:00

Clob字段Hibernate

2009-09-25 12:59:53

Hibernate事務

2018-08-03 09:07:40

Linux內存buffercache

2009-06-29 18:32:30

Hibernate

2009-06-12 14:52:21

cascadeinverseHibernate

2012-05-17 10:16:00

HibernateJavamerge

2009-06-24 08:02:15

Hibernateupdate與save
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天拍天天草 | 午夜视频在线观看一区二区 | 亚洲网站在线 | 中文字幕亚洲一区 | 国产欧美精品一区二区三区 | 91一区二区| 欧美一区日韩一区 | 国产精品久久在线 | 欧洲精品在线观看 | 精品熟人一区二区三区四区 | 国产欧美在线播放 | 午夜视频在线免费观看 | 日韩1区| 久久精品欧美一区二区三区不卡 | 成人三级在线播放 | 久久成人久久 | 久久久精品亚洲 | 国产视频中文字幕 | 久久99精品久久久久久国产越南 | 91社区在线观看高清 | 国产91久久久久久 | 一区二区三区四区免费观看 | 欧美a区 | 精品久久久久久亚洲综合网站 | 超碰在线播 | 91天堂| 中文字幕亚洲一区 | 国产精品久久久久久久7777 | 三级成人在线 | 日韩欧美一级精品久久 | 欧美电影在线 | 影音先锋中文字幕在线观看 | 国产精品一区二区在线 | 国产精品视频免费 | www亚洲精品 | 黑人精品欧美一区二区蜜桃 | 成人h动漫亚洲一区二区 | 成人精品一区二区三区四区 | 在线免费观看a级片 | 97精品国产97久久久久久免费 | 亚洲成人一区二区三区 |