"C#":MySql批量数量导入

  现在对数据库(以MySql为例)的操作大多会封装成一个类,如下例所示:

 1 namespace TESTDATABASE
 2 {
 3     public enum DBStatusCode { ALL_OK, MySqlExcuteErr }
 4     public class TestDB
 5     {
 6         private string hostIp;
 7         private string dbName;
 8         private string dbUser;
 9         private string dbPasswd;
10         private MySqlConnection dbConn;
11
12         public TestDB()
13         {
14             this.initConn();
15         }
16         ~TestDB()
17         {
18             dbConn.Dispose();
19         }
20         void initConn()
21         {
22             dbName = "testDB";
23             hostIp = "127.0.0.1";
24             dbUser = "root";
25             dbPasswd = "root";
26             string connString;    // Connection string。数据库连接字符串大全:http://www.connectionstrings.com/
27             connString = "SERVER=" + hostIp + ";" + "DATABASE=" +
28             dbName + ";" + "UID=" + dbUser + ";" + "PASSWORD=" + dbPasswd + ";";
29             dbConn = new MySqlConnection(connString);
30         }
31         // Open connection
32         public void openConn()
33         {
34             if (dbConn.State == ConnectionState.Closed)
35                 dbConn.Open();
36         }
37         // Close connection
38         public void closeConn()
39         {
40             if (dbConn.State == ConnectionState.Open)
41                 dbConn.Dispose();
42         }
43         // Insert
44         public DBStatusCode insertTest(ItermList itemList)
45         {
46             DBStatusCode flag = DBStatusCode.ALL_OK;
47             openConn();
48             string cmdText = "insert into testTable (c1, c2, c3, c4)"
49                             + "VALUES (@c1, @c2, @c3, @c4)";
50             MySqlCommand cmd = new MySqlCommand(cmdText, dbConn);
51             try
52             {
53                 foreach (Item item in itemList)
54                 {
55                     cmd.Parameters.Clear(); // it is needed
56                     cmd.Parameters.AddWithValue("@c1", item.c1);
57                     cmd.Parameters.AddWithValue("@c2", item.c2);
58                     cmd.Parameters.AddWithValue("@c3", item.c3);
59                     cmd.Parameters.AddWithValue("@c4", item.c4);
60                     cmd.ExecuteNonQuery();
61                 }
62             }
63             catch (Exception ex)
64             {
65                 flag = DBStatusCode.MySqlExcuteErr;
66             }
67             finally
68             {
69                 cmd.Dispose();
70             }
71             closeConn();
72             return flag;
73         }
74     }
75 }

  上边例子涉及到对MySql数据库的数据导入。可以看出(56~60),每循环一次,就会对数据库插入一次。当数据量比较小时,可能还看不出软件的卡顿现象;当数据量很大时,整个软件可能就会卡住几分钟了。所以,我们最好是当所有数据都准备好时,再一次性向数据库定入,以减少插入次数,以最终减少数据导入时间。而且,我们还想,在数据库插入失败的情况下还能够回滚。下边是改进的函数:

 1     // Insert
 2     public DBStatusCode insertTest(ItermList itemList)
 3         {
 4             DBStatusCode flag = DBStatusCode.ALL_OK;
 5             openConn();
 6             string cmdText = "insert into testTable (c1, c2, c3, c4)"
 7                             + "VALUES (@c1, @c2, @c3, @c4)";
 8             MySqlCommand cmd = new MySqlCommand(cmdText, dbConn);
 9             MySqlTransaction tx = this.dbConn.BeginTransaction();
10             cmd.Transaction = tx;
11             try
12             {
13                 foreach (Item item in itemList)
14                 {
15                     cmd.Parameters.Clear(); // it is needed
16                     cmd.Parameters.AddWithValue("@c1", item.c1);
17                     cmd.Parameters.AddWithValue("@c2", item.c2);
18                     cmd.Parameters.AddWithValue("@c3", item.c3);
19                     cmd.Parameters.AddWithValue("@c4", item.c4);
20                     cmd.ExecuteNonQuery();
21                 }
22                 tx.Commit();
23             }
24             catch (Exception ex)
25             {
26                 flag = DBStatusCode.MySqlExcuteErr;
27                 tx.Rollback();
28             }
29             finally
30             {
31                 cmd.Dispose();
32             }
33             closeConn();
34             return flag;
35         }

  这里的改进可以说还只是初步的。当数据特别大时,这种方法就会出问题了。因为计算机要一次性把非常多的数据插入到数据库,有可能因为内存不足等原因而导致最终导入时间过长等。所以,在有一些情况下,我们还得分批提交(tx.Commit()),例如每1000个数据提交一次,这样就能够大大减轻计算机和数据库负担了。

  关于MySql事务介绍资料:

  MySQL 事务

  说说MySQL中的事务

  关于批量插入数据,可参考的资源还有:

  MySQL大量数据插入各种方法性能分析与比较

  在C#中完成海量数据的批量插入和更新

  [C#][SQL SERVER] 提高 Insert 效能

  .NET 批量插入数据,DataSet, SqlDataAdapter.Update

  datatable 使用SqlDataAdapter.Update批量插入更新数据

时间: 2024-10-12 19:30:18

"C#":MySql批量数量导入的相关文章

mysql批量数据导入探究

最近工作碰到一个问题,如何将大量数据(100MB+)导入到远程的mysql server上. 尝试1: Statement执行executeBatch的方法.每次导入1000条记录.时间为12s/1000条.比较慢. 对于1M次的插入这意味着需要4个多小时,期间还会因为网络状况,数据库负载等因素而把载入延迟提升到85s/1000条甚至更高. 效果较差. 尝试2: 使用PreparedStatement,该方法需要预先给定insert操作的“格式”. 实测用这种方式插入的效率为每秒钟数十行. 注意

mysql 批量导入 Packets larger than max_allowed_packet are not allowed

解决方法  :http://blog.csdn.net/gtosky4u/article/details/8581281 mysql 批量导入 Packets larger than max_allowed_packet are not allowed,布布扣,bubuko.com

MySQL批量导入Excel数据

MySQL批量导入Excel数据 1.确定需要导入数据的表名称以及字段,然后在新建的Excel表中,按照表字段正确排序:(注:(Excel文件的名称最好和数据库的名称一致,sheet表的名字最好和表名称一致,方便需要导入多张表数据时一一对应)) 2.在Excel表中,正确填写需要导入的数据,一行数据对应着数据库表中的一行记录:(注:各个字段的格式要求需要和数据库中的限制一样,避免出现差错) 3.收集好需要导入的数据后,点击保存.(注:导入的时候,Excel文件处于打开状态) 4.选中需要导入数据

转载:【高并发简单解决方案 | 靠谱崔小拽 】redis队列缓存 + mysql 批量入库 + php离线整合

需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框架和工具技术固然是最优选择:但是,如果能在现有的框架的基础上提出简单可依赖的解决方案,未尝不是一种提升自我的尝试. 解决: 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异参考文章] 问题二:批量入库就需要有高并发的消息队列,决定

高并发简单解决方案————redis队列缓存+mysql 批量入库

问题分析 思考:应用网站架构的衍化过程中,应用最新的框架和工具技术固然是最优选择:但是,如果能在现有的框架的基础上提出简单可依赖的解决方案,未尝不是一种提升自我的尝试. 解决: 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异] 问题二:批量入库就需要有高并发的消息队列,决定采用redis list 仿真实现,而且方便回滚. 问题三:日志量毕竟大,保存最近30条足矣,决定用php写个离线统计和清理脚本. done,下面是小拽的

【高并发简单解决方案】redis队列缓存 + mysql 批量入库 + php离线整合

原文地址 :https://segmentfault.com/a/1190000004136250需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框架和工具技术固然是最优选择:但是,如果能在现有的框架的基础上提出简单可依赖的解决方案,未尝不是一种提升自我的尝试. 解决: 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题

redis 队列缓存 + mysql 批量入库 + php 离线整合

问题分析 思考:应用网站架构的衍化过程中,应用最新的框架和工具技术固然是最优选择:但是,如果能在现有的框架的基础上提出简单可依赖的解决方案,未尝不是一种提升自我的尝试. 解决: 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异参考文章] 问题二:批量入库就需要有高并发的消息队列,决定采用redis list 仿真实现,而且方便回滚. 问题三:日志量毕竟大,保存最近30条足矣,决定用php写个离线统计和清理脚本. 一:设计数据库

MySql批量插入与唯一索引问题

MySQL批量插入问题 在开发项目时,因为有一些旧系统的基础数据需要提前导入,所以我在导入时做了批量导入操作 ,但是因为MySQL中的一次可接受的SQL语句大小受限制所以我每次批量虽然只有500条,但依然无法插入,这个时候代码报错如下: nested exception is com.mysql.jdbc.PacketTooBigException: Packet for query is too large (5677854 > 1048576). You can change this va

Powershell管理系列(二十六)PowerShell操作之批量导出&导入邮箱

-----提供AD\Exchange\Lync\Sharepoint\CRM\SC\O365等微软产品实施及外包,QQ:185426445.电话18666943750 项目中有时候做跨林邮箱迁移的时候,条件不成熟,比如安全考虑或者其他考虑,不能做双林信任,这样就提出了一个问题,历史邮件需要使用的话怎么办,一个简单高效的解决办法就是从源森林批量导出邮件为.pst文件,在批量导入到目的域森林,具体操作如下: 1.赋予管理账号邮件导入导出权限,命令如下: cls whoami New-Manageme