2011-03-23 60 views
1

我需要在Oracle數據庫中插入一百萬個對象,現在需要很多時間才能完成這項工作,我該如何在數據庫中插入更快的對象?如何使用nhibernate更快插入?

我使用這個代碼來做到這一點:

using (ISession session = NHibernateHelper.OpenSession()) 
{ 
    using (ITransaction tranx = session.BeginTransaction()) 
    { 
    session.Save(movimientoPendiente); 
    tranx.Commit(); 
    } 
} 

感謝您的幫助。

回答

0

使用單個會話而不是爲每條記錄創建到數據庫的新連接。 Jimmy Bogard寫了關於使用NHibernate進行批量處理的a good blog post

+0

感謝RexM,使用批量插入它效果很好,最後我在不到10秒的時間內插入了所有記錄。 – fcartu 2011-03-23 15:24:58

2

通常,ORM不適用於ETL風格的工作,如加載1m記錄。他們所做的那些奇特的事情,比如變化跟蹤,相當迷茫,而且幾乎不需要開銷。直接出ADO.NET是你的朋友在這裏。

但它可能會幫助,如果你使用一個會話和一個交易,多單記錄更多:

using (ISession session = NHibernateHelper.OpenSession()) 
using (ITransaction tranx = session.BeginTransaction()) 
{ 
    foreach (var rec in MyRecords) 
    { 
     session.Save(movimientoPendiente); 
    } 
    tranx.Commit(); 
} 

這至少意味着你沒有建立一個比較昂貴的會話和刻錄相當昂貴的交易每次你發送一條記錄。

+0

+1對於使用單個會話,但有時使用域可以幫助導入過程中驗證數據。 – 2011-03-23 14:44:35

4

使用無狀態會話,做在同一個事務中的所有刀片:

using (var session = NHibernateHelper.GetSessionFactory().OpenStatelessSession()) 
using (var tranx = session.BeginTransaction()) 
{ 
    for(...) 
    { 
     var movimientoPendiente = ...; 
     session.Insert(movimientoPendiente); 
    } 

    tranx.Commit(); 
} 
+0

OpenStatelessSession真的提高了速度。 – Tony 2014-08-24 02:02:44