2011-07-25 44 views
1

我們正在開發一個使用NHibernate的c#windows服務,它應該處理一批記錄。Nhibernate中的Multithread UnitOfWork

該服務目前需要處理約6000多條記錄,並且需要約3個小時來處理這些記錄。發生很多db命中,並且在我們試圖最小化這些時,我們還在探索多線程選項來提高性能。

我們使用UnitOfWork模式來訪問NHibernate會話。

這是服務大致的樣子:

public class BatchService 
    { 
     public DoWork() 
     { 
      StartUnitOfWork(); 

      foreach (var record in recordsToBeProcessed) 
      { 
       Process(record); 
       // Perform lots of db operations 
      } 

      StopUnitOfWork(); 
     } 
    } 

我們想用任務並行庫嘗試分批處理這些記錄(使用Parallel.Foreach()方法)的。 從我已閱讀的NHibernate到目前爲止,我們應該爲每個線程提供一個單獨的NHibernate會話。

我的查詢是我們如何提供這個..考慮UnitOfWork模式,它只允許一個會話可用。

我是否應該考慮圍繞單個記錄的處理打包UnitOfWork?

任何幫助非常感謝。

感謝

回答

4

的最好方法是開始一個新的UnitOfWork爲每個線程,使用線程靜態上下文session NHibernate.Context.ThreadStaticSessionContext。您必須瞭解獨立實體。

2

最簡單的方法是將記錄的每個處理包裝在其自己的工作單元中,然後在其自己的線程上運行每個UOW。您需要確保每個UOW會話都是在單個線程上啓動,使用和完成的。

爲了獲得性能,您可以將批量記錄拆分爲較小批次,然後將這些較小批量的處理包裝到UOW中並在單獨的線程上執行它們。

根據您使用二級緩存(memcached/membase)的工作負載可能會顯着提高性能。 (例如,如果您需要從db中讀取一些記錄以進行每次處理)