2012-06-15 2 views
0

편집 :일괄 삽입

난과 유창함 NHibernate에, 자 NHibernate를 사용하고 다음과 같이 오라클 DB 그래서 내가 수행하고있어 테스트는 다음과 같습니다

[Test] 
    public void CanIInsertLargeVolumesOfDataToOracleInUnder5Mins() 
    { 
     var stopwatch = new Stopwatch(); 
     stopwatch.Start(); 
     var entities = GetEntities(); 

     using (var session = UnitOfStatelessWork.GetUnderlyingSession()) 
     { 
      using (var transaction = session.BeginTransaction(IsolationLevel.ReadCommitted)) 
      { 
       foreach (var entity in entities.Select(entity => new EntityObject(entity) {SomeProperty = 19675464.25M})) 
       { 
        session.Insert(entity); 
       } 

       transaction.Commit(); 
      } 
     } 

     stopwatch.Stop(); 
     var time = stopwatch.Elapsed; 
     Assert.IsTrue(time < TimeSpan.FromMinutes(5.0)); 
    } 

내 연결 문자열은 다음과 같습니다

<connectionStrings> 
    <add connectionString="Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=myhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=some.service.com)));User ID=user;Password=user" name="OracleConnection" providerName="Oracle.DataAccess.Client" /> 
</connectionStrings> 

나는 SQL Server에 대한 다음과 같은 유창한 구성이 있습니다

012 오라클 그런 3,516,
var fluentConfiguration = Fluently 
      .Configure() 
      .Database(MsSqlConfiguration.MsSql2005.ConnectionString(c => c.Is(connStr))) 
      .Mappings(m => m.FluentMappings.AddFromAssembly(mappingAssembly)); 
     fluentConfiguration.ExposeConfiguration(f => 
                { 
                 f.SetProperty("generate_statistics", "false"); 
                 f.SetProperty("command_timeout", "60"); 
                 f.SetListener(ListenerType.PreInsert, new AuditEventListener()); 
                 f.SetListener(ListenerType.PreUpdate, new AuditEventListener()); 
                 f.SetProperty("adonet.batch_size", "1"); 
                 f.SetProperty("hibernate.order_inserts", "true"); 
                 f.SetProperty("hibernate.order_updates", "true"); 
                }); 

:

var fluentConfiguration = Fluently 
      .Configure() 
      .Database(OracleClientConfiguration.Oracle10.AdoNetBatchSize(1000).ConnectionString(c => c.Is(connStr))) 
      .Mappings(m => m.FluentMappings.AddFromAssembly(mappingAssembly)); 
     fluentConfiguration.ExposeConfiguration(f => 
                { 
                 f.SetProperty("generate_statistics", "false"); 
                 f.SetProperty("command_timeout", "60"); 
                 f.SetProperty("hibernate.connection.driver_class", "NHibernate.Driver.OracleDataClientDriver"); 
                 f.SetListener(ListenerType.PreInsert, new AuditEventListener()); 
                 f.SetListener(ListenerType.PreUpdate, new AuditEventListener()); 
                 f.SetProperty("hibernate.order_inserts", "true"); 
                 f.SetProperty("hibernate.order_updates", "true"); 
                }); 

은 그때 두 데이터베이스에 대한 무 상태 세션 및 배치를 사용하고 있는데 약의 SQL DB에 750,000 레코드를 삽입 할 수 있습니다. 100 초.

오라클의 경우 동일한 테스트에 약 12 ​​분이 걸립니다.

누구나 볼 수없는 오류가 보입니까?

+0

그래서 그것은 오라클에 빠른 데이터 삽입에 관한 한 NHibernate가 아닌 것 같습니다 ... ODP.NET 및 배열 바인딩을 사용하여 종료 ... 약 750000 레코드가 삽입되었습니다. 50 초. 정렬되었습니다! –

답변

0
  • 무 상태 세션은 SetProperty("adonet.batch_size", "1")

그래서 배치는 그것과는 상관이 없을 때 당신은 배치 크기를 재정의 배치를

  • 를 사용하지 마십시오. 우리는 코드가 삽입물을 어떻게 처리하는지에 대한 충분한 정보가 없기 때문에 더 많은 정보를 얻을 수 있습니다.

    제 생각에는 .net 프로파일 러를 사용하여 시간을 확인하는 것입니다.

  • +0

    답변 해 주셔서 감사합니다. 그래서 열심히 편집 해 보겠다. 나는 실제로 포스트에서 삭제 된 질문을 게시 한 후'SetProperty ("adonet.batch_size", "1")'행을 제거했다. 무 상태 세션과 일괄 처리 작업과 관련하여 NHProf로 프로필을 작성 중이 었으며 일괄 처리 작업은 무국적 세션과 함께 작동하지만 틀렸을 수도 있습니다. 실험실에서 작은 시간 동안 말하면서 사용할 수 있었을 것입니다. 정상적인 세션. 성능 차이는 여전히 중요합니다. 여기에 뭔가 잘못 되었나요? –

    +0

    ... 그건 혼란을 피하기 위해 열심히 저의 편집입니다. –