2009-06-11 5 views
10

현재 NHibernate를 사용하고 있습니다. 나는이 같은 데이터베이스에 기록의 무리를 저장해야 할 상황이 있습니다한번에 1000+ 레코드를 데이터베이스에 저장합니다.

var relatedTopics = GetRelatedTopics(topic); 
foreach (var relatedTopic in relatedTopics /* could be anywhere from 10 - 1000+ */) 
{ 
    var newRelatedTopic = new RelatedTopic { RelatedTopicUrl = relatedTopic, TopicUrl = topic.Name }; 
    _repository.Save(newRelatedTopic); 
} 

분명히 매우 데이터베이스에 여러 번 공격 할 필요가 과세되는이를 저장하는 기록의 톤이있는 경우. 더 나은 접근 방법은 무엇입니까? 내가 할 수있는 일괄 업데이트가 있습니까? DataSet을 사용하는 것이 더 낫지 않습니까?

감사합니다.

+0

저는 David P의 대답을이 문제의 해결책으로 받아 들일 것입니다. –

답변

12

adonet.batch_size를 설정하면 상황이 개선 될 수 있습니다. 이를 위해

당신이 가지고있는 NH 구성

  • 설정 adonet.batch_size에 예

:

  • m_sessionFactory = Fluently 
         .Configure() 
         .Database(MsSqlConfiguration 
          .MsSql2005 
          .ConnectionString(c => c.FromConnectionStringWithKey("testme")) 
          ) 
         .Mappings(m => m.FluentMappings 
          .AddFromAssemblyOf<TestImpl>()) 
         .ExposeConfiguration(config => 
         { 
          config.SetProperty("adonet.batch_size", "1"); 
          m_configuration = config; 
         }) 
         .BuildSessionFactory(); 
    
    직전 세션에 배치 크기를 설정 저장

    using (ISession session = m_nhibernateSessionFactory.GetSession()) 
    using (var tx = session.BeginTransaction()) 
    {  
        session.SetBatchSize(1000);  
        foreach (var server in serverz) 
        { 
         session.SaveOrUpdate(server); 
        } 
        tx.Commit(); 
    } 
    
+0

좀 더 자세히 설명해 주실 수 있습니까? – Micah

+1

왜 m_configuration을 설정하고 있습니까? SetBatchSize에서 여전히 오류가 발생하고 그 이유를 알아 내려고했습니다. 오라클을 사용하고 있습니다. 아마도 배치 크기를 지원하지 않습니다. ?? –

1

DataSet? 번호 : 대량 삽입? 예.

많은 레코드를 삽입하고 삽입이 매우 단순하면 Bulk Insert를보고 ORM을 꺼내야합니다.

+0

좀 더 자세히 설명해 주시겠습니까? 전에 Bulk 삽입물을 다뤄 본 적이 없습니다. 감사! – Micah

1

레코드를 삽입하는 가장 빠른 방법은 텍스트 파일을 생성하고 LOAD FILE 구문을 사용하는 것입니다. 대부분의 데이터베이스는 데이터 파일을 데이터베이스로 가져 오는 데 매우 빠른 구현을 제공합니다. 다른 데이터베이스의 경우

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

을 적절한 설명서를 참조하십시오 : MySQL의 내용은 아래를 참조하십시오. 이것은 백만 개의 레코드 또는 수천 개의 레코드를 자주 삽입 할 때 유용합니다. 그렇지 않으면, 당신이 할 수있는 최선은 삽입의 1000s와 함께 큰 SQL을 만들고 ORM과 관련 검증을 건너 뛰는 데이터베이스 연결에 직접 실행하는 것입니다.

3

상황에 따라 다양한 옵션이 있다고 생각합니다.

NHibernate 2.1 알파를 사용할 수 있다면, 새로운 실행 파일 HQL을 사용할 수 있습니다.

http://nhibernate.info/blog/2009/05/05/nh2-1-executable-hql.html

토비아스의 대답은 잘 작동합니다. 배치 크기를 설정하면 성능이 상당히 향상됩니다. 는 SQL Server의 대량 삽입을하는 당신이 ADO.Net과 손 더러운하려는 경우

...

의 SQL 대량 복사의 사용을 통해 가능하다.

그 예

은 여기에 있습니다 : 데이터베이스에있는 다른 기업의 기반으로 새로운 개체를 만드는 것처럼 나에게 http://dotnetslackers.com/articles/ado_net/SqlBulkCopy_in_ADO_NET_2_0.aspx

보인다.내게 그것은 저장 프로 시저를 사용하는 이상적인 시나리오 인 것 같습니다.

4

나는이 당신을 위해 무엇을 찾고있는 것으로 판단 :

Bulk Data Operations With NHibernate's Stateless Sessions

기본적으로 대신의 ISession를 열고, 당신은 IStatelessSession을 열고 당신의 hibernate.cfg.xml에 당신은 설정할 수 있습니다

<property name="adonet.batch_size">100</property> 
관련 문제