Hibernate中擷取資料的方式?

來源:互聯網
上載者:User
Hibernate擷取資料的方式有不同的幾種,其與緩衝結合使用的效果也不盡相同,而Hibernate中具體怎麼使用緩衝其實是我們很關心的一個問題,直接涉及到效能方面。
緩衝在Hibernate中主要有三個方面:一級緩衝、二級緩衝和查詢快取;一級緩衝在Hibernate中對應的即為session範圍的緩衝,也就是當session關閉時緩衝即被清除,一級緩衝在Hibernate中是不可配置的部分;二級緩衝在Hibernate中對應的即為SessionFactory範圍的緩衝,通常來講SessionFactory的生命週期和應用的生命週期相同,所以可以看成是進程緩衝或叢集緩衝,二級緩衝在Hibernate中是可以配置的,可以通過class-cache配置類粒度層級的緩衝(class-cache在class中資料發生任何變化的情況下自動更新),同時也可通過collection-cache配置集合粒度層級的緩衝(collection-cache僅在collection中增加了元素或者刪除了元素的情況下才自動更新,也就是當collection中元素髮生值的變化的情況下它是不會自動更新的),緩衝自然會帶來並發的訪問問題,這個時候相應的就要根據應用來設定緩衝所採用的交易隔離等級,和資料庫的交易隔離等級概念基本一樣,沒什麼多介紹的,^_^;查詢快取在Hibernate同樣是可配置的,預設是關閉的,可以通過設定cache.use_  query_cache為true來開啟查詢快取。根據緩衝的通常實現策略,我們可以來理解Hibernate的這三種緩衝,緩衝的實現通過是通過key/value的Map方式來實現,在Hibernate的一級、二級和查詢快取也同樣如此,一級、二級緩衝使用的key均為po的主鍵ID,value即為po執行個體對象,查詢快取使用的則為查詢的條件、查詢的參數、查詢的頁數,value有兩種情況,如果採用的是select  po.property這樣的方式那麼value為整個結果集,如採用的是from這樣的方式那麼value為擷取的結果集中各po對象的主鍵ID,這樣的作用很明顯,節省記憶體,^_^
簡單介紹完Hibernate的緩衝後,再結合Hibernate的擷取資料方式來說明緩衝的具體使用方式,在Hibernate中擷取資料常用的方式主要有四種:Session.load、Session.get、Query.list、Query.iterator。
1、Session.load
           在執行session.load時,Hibernate首先從當前session的一級緩衝中擷取id對應的值,在擷取不到的情況下,將根據該對象是否配置了二級緩衝來做相應的處理,如配置了二級緩衝,則從二級緩衝中擷取id對應的值,如仍然擷取不到則還需要根據是否配置了消極式載入來決定如何執行,如未配置消極式載入則從資料庫中直接擷取,在從資料庫擷取到資料的情況下,Hibernate會相應的填充一級緩衝和二級緩衝,如配置了消極式載入則直接返回一個代理類,只有在觸發代理類的調用時才進行資料庫查詢的操作。
           在這樣的情況下我們就可以看到,在session一直開啟的情況下,要注意在適當的時候對一級緩衝進行重新整理操作,通常是在該對象具有單向關聯維護的時候,在Hibernate中可以使用象session.clear、session.evict的方式來強制重新整理一級緩衝。
           二級緩衝則在資料發生任何變化(新增、更新、刪除)的情況下都會自動的被更新。
2、Session.get
           在執行Session.get時,和Session.load不同的就是在當從緩衝中擷取不到時,直接從資料庫中擷取id對應的值。
3、Query.list
           在執行Query.list時,Hibernate的做法是首先檢查是否配置了查詢快取,如配置了則從查詢快取中尋找key為查詢語句+查詢參數+分頁條件的值,如擷取不到則從資料庫中進行擷取,從資料庫擷取到後Hibernate將會相應的填充一級、二級和查詢快取,如擷取到的為直接的結果集,則直接返回,如擷取到的為一堆id的值,則再根據id擷取相應的值(Session.load),最後形成結果集返回,可以看到,在這樣的情況下,list也是有可能造成N次的查詢的。
           查詢快取在資料發生任何變化的情況下都會被自動的清空。
4、Query.iterator
           在執行Query.iterator時,和Query.list的不同的在於從資料庫擷取的處理上,Query.iterator向資料庫發起的是select  id  from這樣的語句,也就是它是先擷取符合查詢條件的id,之後在進行iterator.next調用時才再次發起session.load的調用擷取實際的資料。
  可見,在擁有二級緩衝並且查詢參數多變的情況下,Query.iterator會比Query.list更為高效

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.