zoukankan      html  css  js  c++  java
  • MSSql Server 批量插入数据优化

        针对批量入库, .Net Framework  提供了一个批量入库Class : SqlBulkCopy , 批量入库性能不错,经测试 四万左右数据 2秒入库。

       

        以下是测试Demo , 使用外部传入事务 tran , 后续 将多个操作挂在同一个tran 上 , 便于回退。

        需要注意几点:

      1. 最好显示指定列映射关系,否则SqlBulkCopy 中按照顺序索引映射,意外可能发生。

      2. 若连接对象通过 SqlTransaction tran =  conn.BeginTransaction() 开启事务,接下来 , 基于该连接查询,或修改操作均需要关联 tran .  如  sqlCommand.Transaction = tran

      3. 一个SqlCommand 关联一条Sql , 多条 Sql 创建多个Sqlcommand。

                            LogHelper.WriteMes(LogLevel.Core, "PDES.CORE", title, string.Format("预计批量插入数据行数:{0}", lstInsert.Count));
    
                            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran))
                            {
                                //入库超时时间 20 分钟
                                bulkCopy.BulkCopyTimeout = 20 * 60;
    
                                //添加列映射
                                foreach (KeyValuePair<string, DataMapPairEntity> p in pair.ColumnMaps) {
                                    bulkCopy.ColumnMappings.Add(p.Value.TARGET_COLUMN_NAME, p.Value.TARGET_COLUMN_NAME);
                                }
                                
    
                                bulkCopy.DestinationTableName = TableName;
                                bulkCopy.WriteToServer(lstInsert.ToArray());
                            }
    
                            LogHelper.WriteMes(LogLevel.Core, "PDES.CORE", title, string.Format("结束批量插入数据行数:{0}", lstInsert.Count));
    

     一个数据库连接开启事务后,基于该连接 数据库操作若未启用相关事务 , 报异常如图:

  • 相关阅读:
    xml技术基础
    apue第七章学习总结
    自然连接,外部连接,内连接,左右连接的区别与介绍(转)
    apue第六章学习总结
    《深入PHP与jQuery开发》读书笔记——Chapter2
    apue第四章学习总结
    《深入PHP与jQuery开发》读书笔记——Chapter1
    我所使用的一个通用的Makefile模板
    PHP的输出缓冲区(转)
    Nginx 日志按月分割
  • 原文地址:https://www.cnblogs.com/a_bu/p/7872840.html
Copyright © 2011-2022 走看看