dapper 使用sqlbulkcopy,50秒插入百万数据

在netcore中常常使用的EF,Dapper等orm框架,在做批量数据插入的时候,一般都是两种操作;

1:逐行插入,insert into....

2:批量插入。

最近项目中遇到个问题,需要同时插入大量的数据,数据量达到了百万级,使用传统的方式性能上完全不达标,不知道大家试过没有尼,使用dapper或者ef一次性插入一百万的数据,总耗时8分钟左右,这还是优化过的方案。

考虑之下,让我想起了很早之前Ado.Net中使用的复制,粘贴,大数据拷贝。sqlbulkcopy

dapper使用SqlBulkcopy需要引用

仔细研究之下,在考虑是不是可以和Dapper混合使用尼。经过几个小时的研究逐梦,做了如下封装,可以直接使用。

public void InsertBatchTest<T>(IEnumerable<T> entityList, IDbTransaction transaction = null) where T:class
        {
            using (IDbConnection conn = new SqlConnection(connection))
            {
                var tbName = string.Format("dbo.{0}", typeof(T).Name);
                var trans = (SqlTransaction)transaction;
                using (var bulkCopy = new SqlBulkCopy(conn as SqlConnection, SqlBulkCopyOptions.TableLock,trans))
                {
                    bulkCopy.BatchSize = 10000;
                    bulkCopy.BulkCopyTimeout = 60;
                    bulkCopy.DestinationTableName = tbName;
                    var table = new DataTable();
                    DapperExtensions.Sql.ISqlGenerator sqlGenerator = new SqlGeneratorImpl(new DapperExtensionsConfiguration());
                    var classMap = sqlGenerator.Configuration.GetMap<T>();
                    var props = classMap.Properties.Where(x => x.Ignored == false).ToArray();
                    foreach (var propertyInfo in props)
                    {
                        bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name);
                        table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyInfo.PropertyType) ?? propertyInfo.PropertyInfo.PropertyType);
                    }
                    var values = new object[props.Count()];
                    foreach (var itemm in entityList)
                    {
                        for (var i = 0; i < values.Length; i++)
                        {
                            values[i] = props[i].PropertyInfo.GetValue(itemm, null);
                        }
                        table.Rows.Add(values);
                    }

                    try
                    {
                        conn.Open();
                        bulkCopy.WriteToServer(table);
                    }
                    catch (Exception)
                    {
                        conn.Close();
                        conn.Dispose();
                    }
                   
                }
            }
        }

sqlbulkcopy的原理就是先写入数据库表的内存中,在插入数据表,经过几十次的测试,基本耗时都在50多秒。

代码以封装好,大家可以直接使用。个人小网站,大家可以留言提点建议(感激不尽):https://www.51wzuan.cn/

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜钓星云

如果解决了问题/赏点吧/饿死了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值