NHibernate系列文章二十一:消極式載入

來源:互聯網
上載者:User

標籤:

摘要

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系列文章二十一:消極式載入

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.