標籤:
摘要
NHibernate的消極式載入機制是很重要的內容。通過關係映射將資料庫表之間的關係映射成對象之間的關係,如果沒有消極式載入機制,從主表的一個對象的查詢將直接查詢出所有與該對象關聯的其他對象,如果關聯的對象上還有其他的關聯對象,還要去查詢其他的對象。如果這張“網”非常大,或者關聯的資料庫記錄非常多的話,每次查詢主表記錄都要把整個資料庫都查詢一遍,這樣效率會非常低下。為瞭解決這個問題產生了NHibernate消極式載入。對一些屬性設定消極式載入,只在對象訪問到這些屬性的時候才去查詢資料庫,很大程度上提高了系統效能。
屬性是否使用消極式載入在對應檔裡設定lazy="true|false"來開啟|關閉消極式載入。(NHibnerate 4.0預設是開啟消極式載入,預設值是true,使用消極式載入)。
程式示範
1、預設使用消極式載入的情況
假設資料庫Customer表裡有一條Id為2的記錄,與之關聯的Order表裡有兩條Order記錄。
var customer = customerService.GetById(2);
執行此行代碼得到的監控結果。
監控結果顯示,只查詢了Customer表記錄。
如果將程式改成下面這樣:
1 var customer = customerService.GetById(2);2 var orders = customer.Orders;3 int orderCount = orders.Count;
再次運行程式,得到監控結果:
在執行這句下面指派陳述式的時候,才去執行Order表的查詢。
int orderCount = orders.Count;
2、關閉消極式載入
修改Customer.hbm.xml檔案。
<set name="Orders" table="`Order`" cascade="all-delete-orphan" inverse="true" lazy="false"> <key column="CustomerId"/> <one-to-many class="Order"/> </set>
執行同樣的查詢語句,得到監控結果。
監控記錄顯示,在查詢Customer的同時,還查詢了Order記錄。
只有在關聯的屬性記錄數量不是很多的情況下才使用lazy="false",關掉消極式載入。
結語
NHibernate的消極式載入是NHibernate很重要的一個效能最佳化,NHibernate預設是開啟消極式載入的,可以通過設定屬性的lazy="false"強制關閉某一個屬性的消極式載入。
NHibernate系列文章二十一:消極式載入