편집 :일괄 삽입
난과 유창함 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 분이 걸립니다.
누구나 볼 수없는 오류가 보입니까?
그래서 그것은 오라클에 빠른 데이터 삽입에 관한 한 NHibernate가 아닌 것 같습니다 ... ODP.NET 및 배열 바인딩을 사용하여 종료 ... 약 750000 레코드가 삽입되었습니다. 50 초. 정렬되었습니다! –