3

我在项目中有 dapper orm,并且我在数据库中保存了数据(1200000row)的 alto,但是与 dapper 的事务非常慢,我想要快速。使用 nhibernate(无状态会话)很慢。我认为 dapper 很快,因为使用 nhibernate 在 33 秒内获取数据(700000),而使用 dapper 在 9 秒内获取数据(700000)。

问题如何解决?

我的代码是:

IDbTransaction trans = connection.BeginTransaction();
connection.Execute(@"
    insert DailyResult(Id, PersonId,DateTaradod,DailyTaradods)
    values(@Id, @PersonId,@DateTaradod,@DailyTaradods)", entity, trans);                                    
trans.Commit();
4

1 回答 1

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、推送、提交 tran”,您不妨使用内部事务。

如果您不想使用SqlBulkCopy,您也可以查看表值参数方法,但在处理此卷时SqlBulkCopy将是我推荐的 API。

注意:如果表的列多于Id、和PersonId,您可以指定显式以调整插入的行为方式。DateTaradodDailyTaradodsbcp.ColumnMappings

于 2013-07-02T10:17:01.557 回答