溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-12-04 16:22:32 來源:億速云 閱讀:123 作者:iii 欄目:編程語言

這篇文章主要介紹“Hibernate怎么對數(shù)據(jù)索引進(jìn)行緩存”,在日常操作中,相信很多人在Hibernate怎么對數(shù)據(jù)索引進(jìn)行緩存問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Hibernate怎么對數(shù)據(jù)索引進(jìn)行緩存”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

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

<hibernate-mapping> <class name=”com.neusoft.entity.User” table=”user”> …  <set name=”addresses” table=”address” lazy=”true” inverse=”true”> <cache usage=”read-only”/> <key column=”user_id”/> <one-to-many class=”com.neusoft.entity.Arrderss”/> </set> </class> </hibernate-mapping>

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

User user=(User)session.load(User.class,”1”);  Collection addset=user.getAddresses();  Iterator it=addset.iterator();  while(it.hasNext()){  Address address=(Address)it.next()  System.out.println(address.getAddress());  }  System.out.println(“Second query……”);  User user2=(User)session.load(User.class,”1”);  Collection it2=user2.getAddresses();  while(it2.hasNext()){  Address address2=(Address)it2.next();  System.out.println(address2.getAddress());  }

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

Select * from user where id=’1’;  Select * from address where user_id=’1’;  Tianjin  Dalian  Second query……  Select * from address where id=’1’;  Select * from address where id=’2’;  Tianjin  Dalian

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

<hibernate-mapping> <class name=”com.neusoft.entity.User” table=”user”> …  <set name=”addresses” table=”address” lazy=”true” inverse=”true”> <cache usage=”read-write”/> <key column=”user_id”/> <one-to-many class=”com.neusoft.entity.Arrderss”/> </set> </class> </hibernate-mapping>

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

Select * from user where id=’1’;  Select * from address where user_id=’1’;  Tianjin  Dalian  Second query……  Tianjin  Dalian

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

到此,關(guān)于“Hibernate怎么對數(shù)據(jù)索引進(jìn)行緩存”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI