我在项目中有一个dapper orm,我已经在数据库中保存了数据(1200000row),但是在与dapper的事务中,我想要fast.with nhibernate(session statetless)很慢。 我认为短小精悍是快速的,因为获取数据(700000)与nhibernate在33秒,与9秒的精巧。
如何解决问题?
我的代码是:
IDbTransaction trans = connection.BeginTransaction();
connection.Execute(@"
insert DailyResult(Id, PersonId,DateTaradod,DailyTaradods)
values(@Id, @PersonId,@DateTaradod,@DailyTaradods)", entity, trans);
trans.Commit();
答案 0 :(得分:5)
没有机制可以通过任何常规ADO.NET API在事务即时中插入1200000行。只是不是那个API的意图。
对于你想要的,听起来你应该使用SqlBulkCopy
。这支持交易,您可以使用FastMember
来提供帮助;例如:
IEnumerable<YourEntity> source = ...
using(var bcp = new SqlBulkCopy(
connection, SqlBulkCopyOptions.UseInternalTransaction))
using(var reader = ObjectReader.Create(source,
"Id", "PersonId", "DateTaradod", "DailyTaradods"))
{
bcp.DestinationTableName = "DailyResult";
bcp.WriteToServer(reader);
}
它还支持外部事务,但如果您要“创建tran,push,commit tran”,您也可以使用内部事务。
如果您不想使用SqlBulkCopy
,您还可以查看表值参数方法,但在处理时SqlBulkCopy
将是我的推荐 API这卷。
注意:如果表的列数多于Id
,PersonId
,DateTaradod
和DailyTaradods
,则可以指定显式bcp.ColumnMappings
来调整插入方式的行为。