2012-07-05 74 views
16

我想要使用連貫的NHibernate將大量對象集合插入到表中,使用調用保存或更新從foreach循環中的集合中傳遞每個實體。我一直在設置批量大小的集合的大小,但我已閱讀Ayende的博客,將其設置爲較大的值不建議,所以我已經在250上限,但是當我在NHProf中查看集合時,我查看插入語句流(該集合約爲20000項),而不是一組批量插入調用。使用流利的NHibernate批量插入實體集合

這看起來效率很低,所花的時間比我預期的要長得多 - 這個查詢本質上是非常基本的 - 將值插入25列(是的,這是一個可以做得更好的地方,但是,這是一個遺留數據庫,我現在堅持)到SQL Server 2008數據庫 - 所以我只能假設我做錯了。

是否有推薦的方法來插入使用NHibernate的大型實體集合?通過使用SaveOrUpdate保存可以提高效率嗎?

add方法的代碼 - 的SetBatchSize調用這個批封頂250,或設置爲集合的大小,如果是低於250:

public void Add(IEnumerable<TEntity> entities) 
{ 
    var session = GetCurrentSession(); 
    using (var transaction = session.BeginTransaction()) 
    { 
     entities = entities.ToList(); 

     session.SetBatchSize(SetBatchSize(entities.Count())); 

     foreach (var entity in entities) 
      session.SaveOrUpdate(entity); 

     transaction.Commit(); 
    } 
} 

道歉稍微模糊的問題,我得到感覺我只是接近錯誤的方式和任何指針將不勝感激!

回答

3

你會想要使用一個StatelessSession來批量插入。

(相關:Inserts of stateless session of NHibernate are slow

+1

謝謝,我已經看過了鏈接,也改變了插入使用無狀態會話,並且它沒有作出任何差別真的。部分問題在於這是一款棕色域名應用,我無法選擇生成身份。有沒有辦法強制NH插入記錄時執行插入而不請求範圍標識? – 2012-07-06 10:50:14

+1

聲明:有一種方法可以讓NHibernate完成任何你想做的事情。但是 - 在這種情況下,你不能改變你的模型。我認爲NH在這種情況下不是適當的工具。 – hometoast 2012-07-06 11:08:06

+1

謝謝,這就是我想要得出的結論。我在另一個問題中特別詢問了範圍標識,以防萬一誰知道我可以使用任何形式的魔法。 – 2012-07-06 11:36:15