문제

현재 nhibernate를 사용하고 있습니다. 다음과 같이 데이터베이스에 많은 레코드를 저장 해야하는 상황이 있습니다.

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);
}

이것을 저장하기위한 많은 레코드가있을 때는 분명히 데이터베이스에 여러 번 데이터베이스를 치는 데 세금이 부과됩니다. 더 나은 접근 방식은 무엇입니까? 내가 할 수있는 배치 업데이트가 있습니까? 데이터 세트를 사용하는 것이 더 낫습니까?

감사

도움이 되었습니까?

해결책

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();
    }
    

다른 팁

나는 이것이 당신이 찾고있는 것이라고 생각합니다.

Nhibernate의 무국적 세션을 사용한 대량 데이터 작업

본질적으로 issession을 열지 않고, 당신은 hibernate.cfg.xml에서 다음을 설정할 수 있습니다.

 <property name="adonet.batch_size">100</property>

상황에 따라 여러 가지 옵션이 있다고 생각합니다.

nhibernate 2.1 알파를 사용할 수 있다면 사용 가능한 새로운 실행 파일 HQL을 사용할 수 있습니다.

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

Tobias의 답변도 효과가 있습니다. 배치 크기를 설정하면 성능이 높아집니다.

ado.net으로 손을 더럽 히고 싶다면 ...

SQL Bulk Copy를 사용하여 SQL Server에서 벌크 인서트를 수행 할 수 있습니다.

그 예는 여기에 있습니다. http://dotnetslackers.com/articles/ado_net/sqlbulkcopy_in_ado_net_2_0.aspx

나에게 그것은 당신이 데이터베이스의 다른 엔티티를 기반으로 새로운 엔티티를 만들고있는 것 같습니다. 저에게 저장된 절차를 사용하는 이상적인 시나리오처럼 보입니다.

데이터 세트? 아니요. 벌크 삽입? 예.

많은 레코드와 인서트가 매우 단순하다는 것을 삽입하는 경우 대량 인서트를 수행하고 ORM을 꺼내는 것을 살펴 봐야합니다.

레코드를 삽입하는 가장 빠른 방법은 텍스트 파일을 생성하고로드 파일 구문을 사용하는 것입니다. 대부분의 데이터베이스에는 데이터 파일을 데이터베이스로 가져 오는 데 매우 빠른 구현이 있습니다. MySQL은 아래를 참조하십시오.

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

다른 데이터베이스의 경우 적절한 매뉴얼을 참조하십시오. 이것은 백만 레코드 또는 수천 개의 레코드를 자주 삽입하는 경우 유용합니다. 그렇지 않으면, 최선을 다하면 1000 년대의 인서트가있는 큰 SQL을 생성하고 데이터베이스 연결에서 직접 실행하여 ORM 및 관련 유효성 검사를 건너 뛰는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top