4.4.5 取得策略

在傳統的關係數據庫訪問中,你可以通過一條SQL語句,利用內連接和外連接來取得所需要的數據。對於一些原始的ORM實現策略來說,訪問對象圖的持久化對象需要對數據庫進行許多瑣碎的請求才行。這種方式沒有充分的利用關係數據庫連接的能力。實際使用中,這種策略的性能很差。ORM中需要處理的最難的問題,就是如何有效的訪問關係型數據。

鑑於我們處理過的多個應用來說,通過對數據庫頻繁訪問的方式來取得數據庫是不可接受的。因此,我們建議工具應該把關注重點更多的集中的關係數據庫上的R

有效的訪問對象圖的問題通常在元數據的關聯映射中得到體現。這個方法的問題就是每個代碼片段都需要使用一組不同的關聯對象。但是這並不足夠。我們建議的是在運行時對於細粒度的關聯取得的支持。Hibernate支持以上不同的策略,默認情況下以及在運行時動態的修改。

對於關聯關係,Hibernate允許你選擇四種不同的取得策略:

1)立即取得:通過順序的讀取數據庫(或者緩存)裏去的關聯對象。

2)延遲加載:當第一次訪問的時候,才加載對象。這會導致對數據庫的訪問。

3Eagar取得:關聯對象或者集合和擁有它的對象同時取得,這種放是使用的SQL的外連接,取得之後,不會對數據庫進行再次訪問。

4)批量加載:用來改善延遲加載的性能,它通過批量加載對象或者集合來達到這個目的。

讓我們仔細的看每個策略。

立即加載

當從數據庫獲得一個實體的時候,立即從數據庫或者緩存獲得其他相關的實體。通常情況下,立即加載的方式的效率並不高,除非關聯的數據已經在緩存中存在。

延遲加載

當客戶端請求一個實體以及其關聯的對象的時候,通常並不需要加載對象圖中的所有對象。你肯定不希望以此把所有對象都放入內存。

延遲加載允許你決定在第一次訪問數據庫的時候加載多少對象。延遲加載是對象持久化的一個基礎概念,同時它也是改善性能的第一步。

我們建議所有的關聯都應該配置成延遲加載的。當在運行時,可以動態的修改這種策略。

Eager加載

延遲加載能夠幫助減少數據加載,它通常是一種默認的策略。然而,看起來這種性能的優化策略更像是瞎猜。

Eager加載允許你顯式的制定那些關聯對象需要在一起加載。Hibernate可以利用外連接來實現這種功能。性能優化也通常需要判斷在Hibernate中合適使用這種加載策略。因此,儘管可以在配置中設置這種加載策略,但是更常見的是在運行時去修改。

批量加載

嚴格上說,批量加載並不算是一種加載策略;它是一種改善延遲加載性能的技術。通常情況下,當你加載一個對象或者集合的時候,你的SQL WHERE中指定對象的標識符。如果批量加載被指定的話,Hibernate就會通過查找代理或者集合,從而在WHERE中指定多個標識符來實現批量加載。

我們並不是這種做法的擁護者;eager加載通常要更快一些。批量加載通常使用那些經驗比較少的開發者,這樣做可以降低SQL的複雜性。

現在讓我們來元數據中爲一些關聯關係配置加載策略。

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