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/
dapper 使用sqlbulkcopy,50秒插入百万数据相关推荐
- 低配MySQL数据库几十秒插入百万数据
- oracle+循环插入sql,SQL server,Oracle循环插入百万数据
SQL server,Oracle循环插入百万数据 SQL server,Oracle循环插入百万数据 压测时常需要往数据库插入大量数据,下面是我往两个数据库插入数据时用的脚本 declare @ma ...
- MySQL十秒插入百万条数据
mysql数据库准备 private String Driver = "com.mysql.cj.jdbc.Driver";private String url ="jd ...
- 【优化】C#利用ODP.NET往oracle中高效插入百万数据
1.将字典Dictionary<string, object[]> 改为Dictionary<string, object>,如果是object[] 在调用时某些转换不了 ...
- sql语句插入百万测试数据
开发的过程中,很多时候我们需要插入百万数据来测试功能和性能,今天我来教大家最简单的插入方法 -----------------1.新建表---------------------CREATE TABL ...
- java insert方法_【Oracle/Java】以Insert ALL方式向表中插入百万条记录,耗时9分17秒...
packagecom.hy;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;import ...
- 【SpringBoot项目中使用Mybatis批量插入百万条数据】
SpringBoot项目中使用Mybatis批量插入百万条数据 话不多说,直接上代码,测试原生批处理的效率 开始测试 背景:因为一些业务问题,需要做多数据源,多库批量查询.插入操作,所以就研究了一下. ...
- Java 百万数据秒级导出到Excel中
出自: 腾讯课堂 700多分钟干货实战Java多线程高并发高性能实战全集 , 我学习完了之后, 我给 老师在课上说的话做了个笔记,以及视频的内容,还有代码敲了一遍,然后添加了一些注释,把执行结果也整理 ...
- 疯狂试探mysql单表insert极限:已实现每秒插入8.5w条数据
很多同学都有这样的困扰: 工作中项目的数据量不大,遇不到sql优化的场景:单表就几万,我优化个der啊: 业务对性能要求不高,远远没达到性能瓶颈:咱这项目又不是不能跑,优化个der啊: 确实,如果你的 ...
最新文章
- 每天60万人次在连接风险WiFi 有你吗
- 使用Myeclipse实现快速调试
- 谈我的“先做人,再做技术人员,最后做程序员”
- P3514-[POI2011]LIZ-Lollipop【思路题】
- python邮件的图片放在哪里_用python保存电子邮件中的嵌入图像
- 海量网络存储系统原理与设计(三)
- 使用ceph-deploy搭建三节点ceph集群
- error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int错误的解决方法
- 使用SQL Server事务复制将SQL Server数据库迁移到Azure SQL数据库
- C# XML文件操作类XmlHelper
- Python 学习笔记 - 协程
- blob类型对象转为file类型对象
- Posta:跨文档信息安全搜索工具
- chrome15调试-使用devtools作为代码编辑器
- vb.net 教程 目录
- 【转】Linux编译程序报错 undefined reference to error 的解决方法
- c语言中可以用什么对任何部分进行注释,C语言程序中可以对程序进行注释,注释部分必须用什么符号括起来?...
- 新时代 新创意 新场景 新消费 2021“设计+”珠宝首饰创新设计展将于10月17日开幕
- 用STM32和ULN2003控制28BYJ-48步进电机正反转固定角度
- 什么是漏洞?最全的漏洞分类!
热门文章
- 网络流(一) 入门到熟练
- Pragmatic Struts
- 20180125 high cohesive low coupling
- html怎吗和图片剧中,HTML中怎么把图片居中
- java 502错误_PHPstorm 10.0.3错误502错误的网关(由于JavaVM?)
- java 一元 二元 三元_一元、二元和三元关系
- 利用剪切干涉法的准直测量
- 四通OKI 5860SP打印机故障的经验分析
- adb logcat 日志格式
- 4G网关8305LN远程监控西门子触摸屏SMART 700IE ZLAN8305LN应用