自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Hibernate對(duì)數(shù)據(jù)索引進(jìn)行緩存

開(kāi)發(fā) 后端
這里介紹Hibernate數(shù)據(jù)索引發(fā)起了兩條select SQL的查詢操作,這里造成了對(duì)性能的浪費(fèi),怎樣才能避免這種情況呢?

Hibernate數(shù)據(jù)索引還是比較常用的,于是我研究了一下Hibernate數(shù)據(jù)索引,在這里拿出來(lái)和大家分享一下,希望對(duì)大家有用。

本文我們引入了一個(gè)全新的概念——Hibernate數(shù)據(jù)索引,下面我們首先將接一下什么是數(shù)據(jù)索引。在Hibernate中對(duì)集合類型進(jìn)行緩存時(shí),是分兩部分進(jìn)行緩存的,首先緩存集合中所有實(shí)體的id列表,然后緩存實(shí)體對(duì)象,這些實(shí)體對(duì)象的id列表,就是所謂的數(shù)據(jù)索引。當(dāng)查找數(shù)據(jù)索引時(shí),如果沒(méi)有找到對(duì)應(yīng)的數(shù)據(jù)索引,這時(shí)就會(huì)一條select SQL的執(zhí)行,獲得符合條件的數(shù)據(jù),并構(gòu)造實(shí)體對(duì)象集合和數(shù)據(jù)索引,然后返回實(shí)體對(duì)象的集合,并且將實(shí)體對(duì)象和數(shù)據(jù)索引納入Hibernate的緩存之中。另一方面,如果找到對(duì)應(yīng)的數(shù)據(jù)索引,則從數(shù)據(jù)索引中取出id列表,然后根據(jù)id在緩存中查找對(duì)應(yīng)的實(shí)體,如果找到就從緩存中返回,如果沒(méi)有找到,在發(fā)起select SQL查詢。在這里我們看出了另外一個(gè)問(wèn)題,這個(gè)問(wèn)題可能會(huì)對(duì)性能產(chǎn)生影響,這就是集合類型的緩存策略。如果我們?nèi)缦屡渲眉项愋停?/P>

  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> 

這里我們應(yīng)用了<cache usage=”read-only”/>配置,如果采用這種策略來(lái)配置集合類型,Hibernate數(shù)據(jù)索引進(jìn)行緩存,而不會(huì)對(duì)集合中的實(shí)體對(duì)象進(jìn)行緩存。如上配置我們運(yùn)行下面的代碼:

  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());  

運(yùn)行這段代碼,會(huì)得到類似下面的輸出:

  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 

我們看到,當(dāng)?shù)诙螆?zhí)行查詢時(shí),執(zhí)行了兩條對(duì)address表的查詢操作,為什么會(huì)這樣?這是因?yàn)楫?dāng)***次加載實(shí)體后,根據(jù)集合類型緩存策略的配置,只對(duì)集合數(shù)據(jù)索引進(jìn)行了緩存,而并沒(méi)有對(duì)集合中的實(shí)體對(duì)象進(jìn)行緩存,所以在第二次再次加載實(shí)體時(shí),Hibernate找到了對(duì)應(yīng)實(shí)體的數(shù)據(jù)索引,但是根據(jù)數(shù)據(jù)索引,卻無(wú)法在緩存中找到對(duì)應(yīng)的實(shí)體,所以Hibernate數(shù)據(jù)索引發(fā)起了兩條select SQL的查詢操作,這里造成了對(duì)性能的浪費(fèi),怎樣才能避免這種情況呢?我們必須對(duì)集合類型中的實(shí)體也指定緩存策略,所以我們要如下對(duì)集合類型進(jìn)行配置:

  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> 

此時(shí)Hibernate會(huì)對(duì)集合類型中的實(shí)體也進(jìn)行緩存,如果根據(jù)這個(gè)配置再次運(yùn)行上面的代碼,將會(huì)得到類似如下的輸出:

  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 

這時(shí)將不會(huì)再有根據(jù)數(shù)據(jù)索引進(jìn)行查詢的SQL語(yǔ)句,因?yàn)榇藭r(shí)可以直接從緩存中獲得集合類型中存放的實(shí)體對(duì)象。

【編輯推薦】

  1. 講解NHibernate Session
  2. 簡(jiǎn)單描述Hibernate Sample
  3. Hibernate Annotations維護(hù)驗(yàn)證邏輯
  4. Hibernate ClassValidator實(shí)例
  5. 描述Hibernate持久性類
責(zé)任編輯:佚名 來(lái)源: InfoQ
相關(guān)推薦

2010-07-22 17:25:23

2010-07-01 12:56:07

SQL Server表

2009-06-17 15:13:30

2021-10-22 06:53:45

脫敏處理數(shù)據(jù)

2009-06-29 08:48:41

Hibernate緩存

2022-08-02 09:32:47

pandas移動(dòng)計(jì)算

2021-08-09 15:00:36

SQL數(shù)據(jù)庫(kù)

2023-10-10 09:13:15

Python數(shù)據(jù)的操作轉(zhuǎn)換

2009-06-17 15:43:03

Hibernate緩存

2009-09-23 17:03:08

Hibernate S

2009-09-25 10:25:54

Hibernate緩存

2012-02-03 11:31:33

HibernateJava

2009-09-25 13:51:13

Hibernate S

2010-11-12 14:16:21

SQL游標(biāo)

2018-04-16 12:14:34

數(shù)據(jù)科學(xué)機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)

2009-06-30 14:08:00

Hibernate緩存

2009-09-22 10:50:04

Hibernate c

2009-09-22 11:24:07

Hibernate查詢

2023-12-10 14:24:41

緩存Go語(yǔ)言

2018-04-25 13:32:31

數(shù)據(jù)保護(hù)GDPRCommvault
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)