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

Hibernate的緩存解讀

開發 后端
緩存是介于物理數據源與應用程序之間,是對數據庫中的數據復制一份臨時放在內存中的容器,其作用是為了減少應用程序對物理數據源訪問的次數,從而提高了應用的運行性能。

緩存是介于物理數據源與應用程序之間,是對數據庫中的數據復制一份臨時放在內存中的容器,其作用是為了減少應用程序對物理數據源訪問的次數,從而提高了應用的運行性能。Hibernate在進行讀取數據的時候,根據緩存機制在相應的緩存中查詢,如果在緩存中找到了需要的數據(我們把這稱做“緩存命中"),則就直接把命中的數據作為結果加以利用,避免了大量發送SQL語句到數據庫查詢的性能損耗。

Hibernate緩存分類:

一、Session緩存(又稱作事務緩存):Hibernate內置的,不能卸除。

緩存范圍:緩存只能被當前Session對象訪問。緩存的生命周期依賴于Session的生命周期,當Session被關閉后,緩存也就結束生命周期。

二、SessionFactory緩存(又稱作應用緩存):使用第三方插件,可插拔。

緩存范圍:緩存被應用范圍內的所有session共享。這些session有可能是并發訪問緩存,因此必須對緩存進行更新。緩存的生命周期依賴于應用的生命周期,應用結束時,緩存也就結束了生命周期,二級緩存存在于應用程序范圍。

Hibernate一些與一級緩存相關的操作(時間點):

數據放入緩存:

1. save()。當session對象調用save()方法保存一個對象后,該對象會被放入到session的緩存中。

2. get()和load()。當session對象調用get()或load()方法從數據庫取出一個對象后,該對象也會被放入到session的緩存中。

3. 使用HQL和QBC等從數據庫中查詢數據。

例如:數據庫有一張表如下:

使用get()或load()證明緩存的存在:

  1. public class Client  
  2. {  
  3.     public static void main(String[] args)  
  4.     {  
  5.         Session session = HibernateUtil.getSessionFactory().openSession();  
  6.         Transaction tx = null;  
  7.         try 
  8.         {  
  9.             /*開啟一個事務*/ 
  10.             tx = session.beginTransaction();  
  11.             /*從數據庫中獲取id="402881e534fa5a440134fa5a45340002"的Customer對象*/ 
  12.             Customer customer1 = (Customer)session.get(Customer.class"402881e534fa5a440134fa5a45340002");  
  13.             System.out.println("customer.getUsername is"+customer1.getUsername());  
  14.             /*事務提交*/ 
  15.             tx.commit();  
  16.               
  17.             System.out.println("-------------------------------------");  
  18.               
  19.             /*開啟一個新事務*/ 
  20.             tx = session.beginTransaction();  
  21.             /*從數據庫中獲取id="402881e534fa5a440134fa5a45340002"的Customer對象*/ 
  22.             Customer customer2 = (Customer)session.get(Customer.class"402881e534fa5a440134fa5a45340002");  
  23.             System.out.println("customer2.getUsername is"+customer2.getUsername());  
  24.             /*事務提交*/ 
  25.             tx.commit();  
  26.               
  27.             System.out.println("-------------------------------------");  
  28.               
  29.             /*比較兩個get()方法獲取的對象是否是同一個對象*/ 
  30.             System.out.println("customer1 == customer2 result is "+(customer1==customer2));  
  31.         }  
  32.         catch (Exception e)  
  33.         {  
  34.             if(tx!=null)  
  35.             {  
  36.                 tx.rollback();  
  37.             }  
  38.         }  
  39.         finally 
  40.         {  
  41.             session.close();  
  42.         }  
  43.     }  

程序控制臺輸出結果:

  1. Hibernate:   
  2.     select  
  3.         customer0_.id as id0_0_,  
  4.         customer0_.username as username0_0_,  
  5.         customer0_.balance as balance0_0_   
  6.     from  
  7.         customer customer0_   
  8.     where  
  9.         customer0_.id=?  
  10. customer.getUsername islisi  
  11. -------------------------------------  
  12. customer2.getUsername islisi  
  13. -------------------------------------  
  14. customer1 == customer2 result is true 

輸出結果中只包含了一條SELECT SQL語句,而且customer1 == customer2 result is true說明兩個取出來的對象是同一個對象。其原理是:***次調用get()方法, Hibernate先檢索緩存中是否有該查找對象,發現沒有,Hibernate發送SELECT語句到數據庫中取出相應的對象,然后將該對象放入緩存中,以便下次使用,第二次調用get()方法,Hibernate先檢索緩存中是否有該查找對象,發現正好有該查找對象,就從緩存中取出來,不再去數據庫中檢索。

數據從緩存中清除:

1. evit()將指定的持久化對象從緩存中清除,釋放對象所占用的內存資源,指定對象從持久化狀態變為脫管狀態,從而成為游離對象。

2. clear()將緩存中的所有持久化對象清除,釋放其占用的內存資源。

其他緩存操作:

1. contains()判斷指定的對象是否存在于緩存中。

2. flush()刷新緩存區的內容,使之與數據庫數據保持同步。

 

Hibernate使用二級緩存

適合存放到第二級緩存中的數據:

1. 很少被修改的數據。

2. 不是很重要的數據,允許出現偶爾并發的數據。

3. 不會被并發訪問的數據。

4. 參考數據,指的是供應用參考的常量數據,它的實例數目有限,它的實例會被許多其他類的實例引用,實例極少或者從來不會被修改。

不適合存放到第二級緩存的數據:

1. 經常被修改的數據。

2. 財務數據,絕對不允許出現并發。

3. 與其他應用共享的數據。

Hibernate如何將數據庫中的數據放入到二級緩存中?注意,你可以把緩存看做是一個Map對象,它的Key用于存儲對象OID,Value用于存儲POJO。首先,當我們使用Hibernate從數據庫中查詢出數據,獲取檢索的數據后,Hibernate將檢索出來的對象的OID放入緩存中key中,然后將具體的POJO放入value中,等待下一次再次向數據查詢數據時,Hibernate根據你提供的OID先檢索一級緩存,若沒有且配置了二級緩存,則檢索二級緩存,如果還沒有則才向數據庫發送SQL語句,然后將查詢出來的對象放入緩存中。

為Hibernate配置二級緩存:

在主配置文件中hibernate.cfg.xml

  1. <property name="hibernate.cache.use_second_level_cache">true</property> 
  2. <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 

配置ehcache.xml

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <ehcache> 
  3.     <!--  
  4.         緩存到硬盤的路徑  
  5.     --> 
  6.     <diskStore path="d:/ehcache"></diskStore> 
  7.       
  8.     <!--  
  9.         默認設置  
  10.         maxElementsInMemory : 在內存中***緩存的對象數量。  
  11.         eternal : 緩存的對象是否永遠不變。  
  12.         timeToIdleSeconds :可以操作對象的時間。  
  13.         timeToLiveSeconds :緩存中對象的生命周期,時間到后查詢數據會從數據庫中讀取。  
  14.         overflowToDisk :內存滿了,是否要緩存到硬盤。  
  15.     --> 
  16.     <defaultCache maxElementsInMemory="200" eternal="false"   
  17.         timeToIdleSeconds="50" timeToLiveSeconds="60" overflowToDisk="true"></defaultCache> 
  18.           
  19.     <!--  
  20.         指定緩存的對象。  
  21.         下面出現的的屬性覆蓋上面出現的,沒出現的繼承上面的。  
  22.     --> 
  23.     <cache name="com.suxiaolei.hibernate.pojos.Order" maxElementsInMemory="200" eternal="false"   
  24.         timeToIdleSeconds="50" timeToLiveSeconds="60" overflowToDisk="true"></cache> 
  25.  
  26. </ehcache> 

在需要被緩存的對象中hbm文件中的<class>標簽下添加一個<cache>子標簽

  1. <hibernate-mapping> 
  2.     <class name="com.suxiaolei.hibernate.pojos.Order" table="orders"> 
  3.         <cache usage="read-only"/> 
  4.           
  5.         <id name="id" type="string"> 
  6.             <column name="id"></column> 
  7.             <generator class="uuid"></generator> 
  8.         </id> 
  9.           
  10.         <property name="orderNumber" column="orderNumber" type="string"></property> 
  11.         <property name="cost" column="cost" type="integer"></property> 
  12.           
  13.         <many-to-one name="customer" class="com.suxiaolei.hibernate.pojos.Customer"   
  14.                      column="customer_id" cascade="save-update"> 
  15.         </many-to-one>          
  16.     </class> 
  17. </hibernate-mapping> 

若存在一對多的關系,想要在在獲取一方的時候將關聯的多方緩存起來,需要再集合屬性下添加<cache>子標簽,這里需要將關聯的對象的hbm文件中必須在存在<class>標簽下也添加<cache>標簽,不然Hibernate只會緩存OID。

  1. <hibernate-mapping> 
  2.         <class name="com.suxiaolei.hibernate.pojos.Customer" table="customer"> 
  3.             <!-- 主鍵設置 --> 
  4.             <id name="id" type="string"> 
  5.                 <column name="id"></column> 
  6.                 <generator class="uuid"></generator> 
  7.             </id> 
  8.               
  9.             <!-- 屬性設置 --> 
  10.             <property name="username" column="username" type="string"></property> 
  11.             <property name="balance" column="balance" type="integer"></property> 
  12.               
  13.             <set name="orders" inverse="true" cascade="all" lazy="false" fetch="join"> 
  14.                 <cache usage="read-only"/> 
  15.                 <key column="customer_id" ></key> 
  16.                 <one-to-many class="com.suxiaolei.hibernate.pojos.Order"/> 
  17.             </set> 
  18.               
  19.         </class> 
  20.     </hibernate-mapping> 

原文鏈接:http://www.cnblogs.com/otomedaybreak/archive/2012/01/20/2328317.html

【編輯推薦】

  1. Hibernate的集合映射
  2. Hibernate關聯關系配置
  3. Hibernate中inverse屬性與cascade屬性
  4. Hibernate復合主鍵映射
  5. Hibernate繼承映射
責任編輯:林師授 來源: 音①曉的博客
相關推薦

2009-09-25 16:29:32

Hibernate一級

2009-06-29 08:48:41

Hibernate緩存

2009-09-22 10:50:04

Hibernate c

2009-09-25 14:20:28

Hibernate繼承映射

2009-09-25 09:46:02

Hibernate高級

2009-06-18 14:51:12

Hibernate緩存Hibernate

2009-09-25 13:51:13

Hibernate S

2009-09-25 10:25:54

Hibernate緩存

2009-06-17 15:43:03

Hibernate緩存

2009-09-23 17:03:08

Hibernate S

2009-09-22 11:24:07

Hibernate查詢

2009-06-30 14:08:00

Hibernate緩存

2009-06-17 15:52:23

Hibernate查詢

2009-06-17 15:13:30

2009-09-27 14:53:38

Hibernate S

2010-07-13 16:20:18

JPA 2.0緩存Hibernate緩存Java EE

2009-06-30 14:11:00

Hibernate緩存

2010-07-12 17:12:37

JPA 2.0緩存Hibernate緩存Java EE

2019-03-20 08:00:00

DNS緩存欺騙惡意軟件

2009-09-28 09:47:55

Hibernate數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 人干人人 | 国产激情精品 | 国产精品99久久久久久宅男 | 国产探花在线精品一区二区 | 免费网站在线 | 污视频免费在线观看 | 国产在线观看一区二区三区 | 国产精品一区二区久久久久 | 国产精品成人国产乱一区 | 男女污污动态图 | 国产精品一区二区久久精品爱微奶 | 99在线观看视频 | 中文字幕国产精品 | 国产免费国产 | 日本天堂一区二区 | 黑人巨大精品欧美一区二区免费 | 欧美中文字幕一区二区三区亚洲 | 国产在线aa | 国产美女精品视频 | 一区二区视频 | 超碰97人人人人人蜜桃 | 亚洲一二三视频 | 91视频一88av | 国产91在线 | 中日 | 成人午夜黄色 | 欧美精品tv | 男女羞羞免费视频 | 男人的天堂中文字幕 | 久草欧美视频 | 国产免费看| 精品久久久久久久人人人人传媒 | 色女人天堂 | 在线观看国产网站 | 视频一区二区三区在线观看 | 久久久国产亚洲精品 | 美女艹b| 国产精品国产精品国产专区不片 | 成人亚洲性情网站www在线观看 | 69性欧美高清影院 | 中文字幕亚洲一区二区三区 | 欧美视频第二页 |