zoukankan      html  css  js  c++  java
  • c#之mysql四种带事务批量插入

    前言

    疫情期间:作诗一首
    历时两月抗疫情,我国人民绝对行,多数城市渐解封,世界疫情又在增,中国派出救援队,牺牲精神大无畏,一省就能顶一国,千万同胞不退缩,两国关系心相接,江苏奋勇去巴铁,难耐邻国把他弃,四川前往意大利,滴水之恩我们讲,上海立马飞伊朗,广东支援伊拉克,凯旋归来齐庆贺,美国扎心也不愁,大家期待你加油

             特此声明 不得转载  转载必究

           对于像我这样的业务程序员开发一些表单内容是家常便饭的事情,说道表单 我们都避免不了多行内容的提交,多行内容保存,自然要用到数据库,如果循环打扰我数据库,数据库也会觉得很累,从而增加数据库服务器压力。所以小子不才,根据平时经验总结了一下用到的批量插入的方法代码。本文是针对c#语言开发,数据库是mysql数据库。当然我这是单片机的本地电脑运行,跟服务器上有很大区别,到了服务器上可能跑的比这快的多,话不多说看下文。

    一 生成数据

    简而言之吧,就拿五万数据实验吧,这里面我就收集了五万条数据

     二 批量方法代码

    第一种:采用mysql中MySql.Data.MySqlClient.MySqlBulkLoader

    看到了这种耗时只需要406毫秒,刺激不,惊喜不,意外不,这个逻辑是先把数据集合转化成table,然后再把table转成csv文件保存到临时文件夹,再利用MySqlBulkLoader对象加载这个csv文件,这个过程是最消耗时间的,最后事务提交,这是最快的方式,五百万数据执行42秒,,

    后期开发中发现一个问题:就是对于数据库如果是bit类型,这个字段在维护bool的时候,数据库默认始终插入1,所以解决办法(1)改数据库字段为int类型(2)在手动拼接csv文件时候如果这个字段值为true,就加入这个字段。,如果为false,就去掉这个字段。

    还有一个问题就是 如果并发操作时候,这个临时csv文件不重复问题,对于这种问题,我已经解决了,,就是在每次生成文件的时候加一个永远 不重复的随机数作为文件名,当一个事务完成后就删除这个文件名,

    这样就解决了并发(并行)问题,,经过后期网上讨论有人说 csv文件对特殊数据格式比如特殊字符 不兼容,,但是 我试了,可以,没有特殊字符格式问题。

    第二种:常规拼接sql

    我们看到了对于五万条数据 ,这种拼接sql方法只用了866毫秒级,这种方式最大的好处就是效率快快快,劣势就是拼接繁琐,没有防参数化注入。

    第三种:SqlDataAdapter的批量更新DataTable集合

    首先我们了解一下SqlDataAdapter

    它是 DataSet和 SQL Server之间的桥接器。SqlDataAdapter通过对数据源使用适当的Transact-SQL语句映射 Fill(它可填充DataSet中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet中的数据)来提供这一桥接。当SqlDataAdapter填充 DataSet时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。

    总的来说,批量更新数据需要的对象主要有三个有:

    SqlDataAdapter核心对象

     SqlCommand 总共需要四个,分别对应数据表的select、add、update、delete操作。具体解释一下。对一张数据表,可能执行四种操作,就是增加、删除、修改、查询,当SqlDataAdapter最后提交操作时,会根据数据表中的每一条记录的标志(增加、删除、修改、查询)来使用对应的SqlCommand对它(一条记录)进行操作,所以需要四个。

     DataSet或DataTable等存储待更新到数据库中的数据。

     这样,我们为了实现数据表的批量更新,可以先把数据表查询到DataSet或DataTable中,然后对其进行各种修改,最后写回到数据库中。

    第四种:Dapper自带内部集合插入

    这种效率最差了,但是对于数据量小的情况下,无妨,简单快捷

     三 总结以上

         相信大家可以看出效率了吧,首先讲一下value和values区别‘:如果数据少的情况下values快点,如果数据量大,value快点。

    第一种 需要建立临时文件,如果数据大会占用服务器内存,但是效率最快,直接传输文件。

    第二种拼接sql好处是效率快,坏处是如果sql多的话 ,1 :比较繁琐,拼接sql稍微不注意就会拼接错误。2如果同时要添加多张表,就要把好几个sql放在一个事务里面一起提交。

    第三种我觉得好处是省时省力,数据量小的情况下 效率也行,只用一次访问数据库。

    第四种当然是dapper在数据量大情况下是最慢的。但是是最简单的。

    所以对于以上,我觉如果几百条以下的数据还是dapper比较划算,最简单。,哦对了还有一种就是循环插入,但是那样没有保证数据一致,还有分批插入也法保证数据一致,我写博客一般都是比较简单分享 ,我不会长篇大论滔滔不绝,最后还没有头尾,可能我的阅历比较少,所以没有内涵,希望广大网友见谅,我会以后多多学习和请教各位

    四 感言

        这是我第一次写博客,以前都是看着比人写,我都是敬而远之,我想明白了,如果不敢迈出第一步,永远都没有第二步,有些事不要害怕去做,不然不做更害怕。2019年过完春节要好好改变一下这一年的自己,毕竟也不小了,人生多做点事就会少点遗憾,不管结果如何,我都还是我。浪迹天涯我不怕,不留遗憾在人间。

  • 相关阅读:
    ORA00257 archiver error. 错误的处理方法
    Eclipse快捷键大全
    struts2 globalresults
    oracle创建表空间
    struts2 action中result参数详解
    struts2小程序登录验证
    清理系统垃圾文件 请命名为:*.bat
    网上免费阅读的计算机编程书籍列表
    eclipse+myeclipse+mysql+tomcat配置数据源
    o(∩_∩)o...哈哈 somethingaboutJAVA
  • 原文地址:https://www.cnblogs.com/wwg1990/p/10362667.html
Copyright © 2011-2022 走看看