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

Hibernate對數據索引進行緩存

開發 后端
這里介紹Hibernate數據索引發起了兩條select SQL的查詢操作,這里造成了對性能的浪費,怎樣才能避免這種情況呢?

Hibernate數據索引還是比較常用的,于是我研究了一下Hibernate數據索引,在這里拿出來和大家分享一下,希望對大家有用。

本文我們引入了一個全新的概念——Hibernate數據索引,下面我們首先將接一下什么是數據索引。在Hibernate中對集合類型進行緩存時,是分兩部分進行緩存的,首先緩存集合中所有實體的id列表,然后緩存實體對象,這些實體對象的id列表,就是所謂的數據索引。當查找數據索引時,如果沒有找到對應的數據索引,這時就會一條select SQL的執行,獲得符合條件的數據,并構造實體對象集合和數據索引,然后返回實體對象的集合,并且將實體對象和數據索引納入Hibernate的緩存之中。另一方面,如果找到對應的數據索引,則從數據索引中取出id列表,然后根據id在緩存中查找對應的實體,如果找到就從緩存中返回,如果沒有找到,在發起select SQL查詢。在這里我們看出了另外一個問題,這個問題可能會對性能產生影響,這就是集合類型的緩存策略。如果我們如下配置集合類型:

  1. <hibernate-mapping> 
  2. <class name=”com.neusoft.entity.User” table=”user”> 
  3. …  
  4. <set name=”addresses” table=”address” lazy=”true” inverse=”true”> 
  5. <cache usage=”read-only”/> 
  6. <key column=”user_id”/> 
  7. <one-to-many class=”com.neusoft.entity.Arrderss”/> 
  8. </set> 
  9. </class> 
  10. </hibernate-mapping> 

這里我們應用了<cache usage=”read-only”/>配置,如果采用這種策略來配置集合類型,Hibernate數據索引進行緩存,而不會對集合中的實體對象進行緩存。如上配置我們運行下面的代碼:

  1. User user=(User)session.load(User.class,”1”);  
  2. Collection addset=user.getAddresses();  
  3. Iterator it=addset.iterator();  
  4. while(it.hasNext()){  
  5. Address address=(Address)it.next()  
  6. System.out.println(address.getAddress());  
  7. }  
  8. System.out.println(“Second query……”);  
  9. User user2=(User)session.load(User.class,”1”);  
  10. Collection it2=user2.getAddresses();  
  11. while(it2.hasNext()){  
  12. Address address2=(Address)it2.next();  
  13. System.out.println(address2.getAddress());  

運行這段代碼,會得到類似下面的輸出:

  1. Select * from user where id=’1’;  
  2. Select * from address where user_id=’1’;  
  3. Tianjin  
  4. Dalian  
  5. Second query……  
  6. Select * from address where id=’1’;  
  7. Select * from address where id=’2’;  
  8. Tianjin  
  9. Dalian 

我們看到,當第二次執行查詢時,執行了兩條對address表的查詢操作,為什么會這樣?這是因為當***次加載實體后,根據集合類型緩存策略的配置,只對集合數據索引進行了緩存,而并沒有對集合中的實體對象進行緩存,所以在第二次再次加載實體時,Hibernate找到了對應實體的數據索引,但是根據數據索引,卻無法在緩存中找到對應的實體,所以Hibernate數據索引發起了兩條select SQL的查詢操作,這里造成了對性能的浪費,怎樣才能避免這種情況呢?我們必須對集合類型中的實體也指定緩存策略,所以我們要如下對集合類型進行配置:

  1. <hibernate-mapping> 
  2. <class name=”com.neusoft.entity.User” table=”user”> 
  3. …  
  4. <set name=”addresses” table=”address” lazy=”true” inverse=”true”> 
  5. <cache usage=”read-write”/> 
  6. <key column=”user_id”/> 
  7. <one-to-many class=”com.neusoft.entity.Arrderss”/> 
  8. </set> 
  9. </class> 
  10. </hibernate-mapping> 

此時Hibernate會對集合類型中的實體也進行緩存,如果根據這個配置再次運行上面的代碼,將會得到類似如下的輸出:

  1. Select * from user where id=’1’;  
  2. Select * from address where user_id=’1’;  
  3. Tianjin  
  4. Dalian  
  5. Second query……  
  6. Tianjin  
  7. Dalian 

這時將不會再有根據數據索引進行查詢的SQL語句,因為此時可以直接從緩存中獲得集合類型中存放的實體對象。

【編輯推薦】

  1. 講解NHibernate Session
  2. 簡單描述Hibernate Sample
  3. Hibernate Annotations維護驗證邏輯
  4. Hibernate ClassValidator實例
  5. 描述Hibernate持久性類
責任編輯:佚名 來源: InfoQ
相關推薦

2010-07-22 17:25:23

2009-06-17 15:13:30

2010-07-01 12:56:07

SQL Server表

2021-10-22 06:53:45

脫敏處理數據

2009-06-29 08:48:41

Hibernate緩存

2023-10-10 09:13:15

Python數據的操作轉換

2021-08-09 15:00:36

SQL數據庫

2022-08-02 09:32:47

pandas移動計算

2012-02-03 11:31:33

HibernateJava

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

2010-11-12 14:16:21

SQL游標

2018-04-16 12:14:34

數據科學機器學習神經網絡

2009-09-22 10:50:04

Hibernate c

2009-09-22 11:24:07

Hibernate查詢

2009-06-30 14:08:00

Hibernate緩存

2014-04-03 13:11:07

數據中心雅虎

2018-04-25 13:32:31

數據保護GDPRCommvault
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品美女视频在免费观看 | 日韩欧美三级电影 | www.天天操.com| 久久成人综合 | 久草欧美视频 | 欧美成人免费在线 | 精品成人一区 | 免费在线观看成人av | 国产日韩一区二区三免费高清 | 81精品国产乱码久久久久久 | 亚洲精品一区二区三区四区高清 | 91精品一区| 久久国产精品免费一区二区三区 | 国产激情一区二区三区 | 欧美一级黑人aaaaaaa做受 | 亚洲国产精品久久久 | 午夜视频免费 | 中文字幕一区在线观看视频 | 久久网一区二区 | 国产精品小视频在线观看 | 青青久久| 亚洲一区二区中文字幕 | 久久久久久天堂 | 欧美一区2区三区4区公司二百 | 欧美综合一区 | 久久精品天堂 | 国产在线精品一区二区 | 麻豆毛片 | 国产精品久久久久久久久久久久 | 精品乱码一区二区 | 国产国产精品 | 精品国偷自产在线 | 午夜精品三区 | 久久精品免费看 | 欧美激情视频一区二区三区免费 | av黄色片在线观看 | 欧美一区不卡 | 国产乱码久久久久久一区二区 | 国产一区二区三区视频 | 日韩美女在线看免费观看 | 9191成人精品久久 |