在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/

dapper 使用sqlbulkcopy,50秒插入百万数据相关推荐

  1. 低配MySQL数据库几十秒插入百万数据

  2. oracle+循环插入sql,SQL server,Oracle循环插入百万数据

    SQL server,Oracle循环插入百万数据 SQL server,Oracle循环插入百万数据 压测时常需要往数据库插入大量数据,下面是我往两个数据库插入数据时用的脚本 declare @ma ...

  3. MySQL十秒插入百万条数据

    mysql数据库准备 private String Driver = "com.mysql.cj.jdbc.Driver";private String url ="jd ...

  4. 【优化】C#利用ODP.NET往oracle中高效插入百万数据

    1.将字典Dictionary<string, object[]>  改为Dictionary<string, object>,如果是object[]  在调用时某些转换不了 ...

  5. sql语句插入百万测试数据

    开发的过程中,很多时候我们需要插入百万数据来测试功能和性能,今天我来教大家最简单的插入方法 -----------------1.新建表---------------------CREATE TABL ...

  6. java insert方法_【Oracle/Java】以Insert ALL方式向表中插入百万条记录,耗时9分17秒...

    packagecom.hy;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;import ...

  7. 【SpringBoot项目中使用Mybatis批量插入百万条数据】

    SpringBoot项目中使用Mybatis批量插入百万条数据 话不多说,直接上代码,测试原生批处理的效率 开始测试 背景:因为一些业务问题,需要做多数据源,多库批量查询.插入操作,所以就研究了一下. ...

  8. Java 百万数据秒级导出到Excel中

    出自: 腾讯课堂 700多分钟干货实战Java多线程高并发高性能实战全集 , 我学习完了之后, 我给 老师在课上说的话做了个笔记,以及视频的内容,还有代码敲了一遍,然后添加了一些注释,把执行结果也整理 ...

  9. 疯狂试探mysql单表insert极限:已实现每秒插入8.5w条数据

    很多同学都有这样的困扰: 工作中项目的数据量不大,遇不到sql优化的场景:单表就几万,我优化个der啊: 业务对性能要求不高,远远没达到性能瓶颈:咱这项目又不是不能跑,优化个der啊: 确实,如果你的 ...

最新文章

  1. 每天60万人次在连接风险WiFi 有你吗
  2. 使用Myeclipse实现快速调试
  3. 谈我的“先做人,再做技术人员,最后做程序员”
  4. P3514-[POI2011]LIZ-Lollipop【思路题】
  5. python邮件的图片放在哪里_用python保存电子邮件中的嵌入图像
  6. 海量网络存储系统原理与设计(三)
  7. 使用ceph-deploy搭建三节点ceph集群
  8. error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int错误的解决方法
  9. 使用SQL Server事务复制将SQL Server数据库迁移到Azure SQL数据库
  10. C# XML文件操作类XmlHelper
  11. Python 学习笔记 - 协程
  12. blob类型对象转为file类型对象
  13. Posta:跨文档信息安全搜索工具
  14. chrome15调试-使用devtools作为代码编辑器
  15. vb.net 教程 目录
  16. 【转】Linux编译程序报错 undefined reference to error 的解决方法
  17. c语言中可以用什么对任何部分进行注释,C语言程序中可以对程序进行注释,注释部分必须用什么符号括起来?...
  18. 新时代 新创意 新场景 新消费 2021“设计+”珠宝首饰创新设计展将于10月17日开幕
  19. 用STM32和ULN2003控制28BYJ-48步进电机正反转固定角度
  20. 什么是漏洞?最全的漏洞分类!

热门文章

  1. 网络流(一) 入门到熟练
  2. Pragmatic Struts
  3. 20180125 high cohesive low coupling
  4. html怎吗和图片剧中,HTML中怎么把图片居中
  5. java 502错误_PHPstorm 10.0.3错误502错误的网关(由于JavaVM?)
  6. java 一元 二元 三元_一元、二元和三元关系
  7. 利用剪切干涉法的准直测量
  8. 四通OKI 5860SP打印机故障的经验分析
  9. adb logcat 日志格式
  10. 4G网关8305LN远程监控西门子触摸屏SMART 700IE ZLAN8305LN应用