? ??? 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屬性來指定,指定關聯查詢數量,以減少批量檢索的數據數目。