2010-11-09 53 views
0

在這種簡單的例子:NHibernate的尋呼性能(更好的選擇)

public class Person 
{ 
    public int Id {get;set;} 
    public int Name {get;set;} 
} 
  • 我需要生成具有分頁功能的電網和訂貨
  • 我的數據庫中有大約10萬的人

什麼選項有更好的表現:

1)獲取所有elemtents在第一時間之後NHibernate的一級緩存中佔據優勢,例如:

​​

實驗值:AsPagination是一個擴展方法...

2)獲取例如:

public virtual IList<T> GetPaginedList(int __pageIndex, int __pageSize,out int __total) 
    {    
     var _rowCount = Session.CreateCriteria(typeof(T)) 
      .SetProjection(Projections.RowCount()).FutureValue<Int32>(); 

     var _results = Session.CreateCriteria(typeof(T)) 
      .SetFirstResult(__pageIndex * __pageSize) 
      .SetMaxResults(__pageSize) 
      .Future<T>(); 

     __total = _rowCount.Value; 
     return _results; 
    } 

回答

4

第二種選擇將是最合適的。

當你(用戶)甚至不'使用'所有這些實例時,一次檢索所有實例是無用的。

如果'Person'類是一個有很多關聯的'重度'類,那麼創建一個'PersonView'類就更好了,該類僅包含要在網格中顯示的屬性。

您不必映射PersonView類,您只需「導入」它,以便NHibernate知道它的存在。 然後,您在Person類上創建查詢,並定義必須使用AliasToBean TransformerPerson實例轉換爲PersonView實例。

通過這樣做,NHibernate將能夠生成一個只從數據庫中檢索必要列的查詢,並將使用它填充PersonView實例。

+0

嗨弗雷德裏克,你能告訴我如何「導入」的觀點和查詢嗎?謝謝 – Paul 2011-01-26 14:19:33

+1

嗨保羅,我已經在這裏回答了類似的問題,代碼示例:http://stackoverflow.com/questions/747382/only-get-latest-results-using-nhibernate – 2011-01-26 16:04:49

1

與許多數據檢索性能問題一樣,哪個更好取決於使用場景。

如果用戶在數據變得過時而無用之前很可能要瀏覽大部分或全部頁面,那麼選項1會更好。在結果集相對較小(2-3頁)的情況下以及結果集變化不大(即從數據庫中提取用戶權限)的情況下,這樣做也更好,從而允許將整個數據集存儲在內存中通過消除網絡往返,提高未來運行的性能。

選項2對於涉及長數據頁和/或總體結果集,「寬」記錄或經常變化的數據以及本地緩存不太好的情況會更好。它將使用結果集時檢索記錄的成本分攤到顯示它們所需的程度。分頁結果的這種「延遲加載」確實增加了獲取記錄的總體時間和開銷(因爲有更多的往返行程),但用戶更有可能注意並抱怨搜索結果的十秒鐘週轉時間比每頁半秒。