Hibernate的檢索策略

    Hibernate的Session在加載一個Java對象時,可以將與這個對象相關聯的其他Java對象都加載到緩存中,以便程序及時調用。但有些情況下,我們不需要加載太多無用的對象到緩存中,一來這樣會撐爆內存,二來增加了訪問數據庫的次數。所以爲了合理的使用緩存,Hibernate提供了幾種檢索策略來供用戶選擇。

Hibernate的檢索策略

    在Hibernate中主要有三種檢索策略,它們是立即檢索策略、延遲檢索策略、左外連接檢索策略。下面分別介紹一下這三種檢索策略。

立即檢索策略

採用立即檢索策略,會將被檢索的對象,以及和這個對象關聯的一對多對象都加載到緩存中。Session的get方法就使用的立即檢索策略。

優點:頻繁使用的關聯對象能夠被加載到緩存中。

缺點:1、佔用內存。2、Select語句過多。


延遲檢索策略

    採用延遲檢索策略,就不會加載關聯對象的內容。直到第一次調用關聯對象時,纔去加載關聯對象。在不涉及關聯類操作時,延遲檢索策略只適用於Session的load方法。涉及關聯類操作時,延遲檢索策略也能夠適用於get,list等操作。

類級別操作時, 延遲檢索策略,只加載類的OID不加載類的其他屬性,只用當第一次訪問其他屬性時,纔回訪問數據庫去加載內容。(這裏使用了CGLIB生成了類的代理類)

關聯級別操作時,延遲檢索策略,只加載類本身,不加載關聯類,直到第一次調用關聯對象時,纔去加載關聯對象

程序模式都是用延遲加載策略。如果需要指定使用延遲加載策略。在配置文件中設置<class>的lazy=true,<set>的lazy=true或extra(增強延遲)<many-to-one>的lazy=proxy和no-proxy。

優點:由程序決定加載哪些類和內容,避免了大量無用的sql語句和內存消耗。

缺點:在Session關閉後,就不能訪問關聯類對象了。 需要確保在Session.close方法前,調用關聯對象。


左外連接檢索策略:

    採用左外連接檢索,能夠使用Sql的外連接查詢,將需要加載的關聯對象加載在緩存中。

<set>fetch設置爲join,<many-to-one>的fetch設置爲 join

優點:1.對應用程序完全透明,不管對象處於持久化狀態,還是遊離狀態,應用程序都可以方便的從一個對象導航到與它關聯的對象。2.使用了外連接,select語句數目少。

缺點:1.可能會加載應用程序不需要訪問的對象,白白浪費許多內存空間。2.複雜的數據庫表連接也會影響檢索性能。


batch-size屬性:

    無論是立即檢索還是延遲檢索,都可以指定關聯查詢的數量,這就需要使用batch-size屬性來指定,指定關聯查詢數量,以減少批量檢索的數據數目。

本文轉自:http://blog.csdn.net/adoocoke/article/details/8291966

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章