随着网站浏览人数的增多,页面浏览日志的记录成了数据库TCP/IP连接数飙升的祸首,初步想法就是先把日志记录到内存,累计到一定数量时,一次性入库。故此,就想到了sqlbulkcopy,它可以使数据批量入库。Msdn对它的描述:使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到DataTable或者IDataReader实例读取数据。

写个控制台程序测试了一下,生成了100000条数据,入库时间大概1秒,不过,只用了两个字段,实际中不会有这么少的字段。

先建一测试表,

CREATE TABLE [dbo].[Person](

[PersonId] [int] IDENTITY(1,1) NOT NULL,

[Name] [nvarchar](100) NOT NULL,

[DateOfBirth] [datetime] NULL,

CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonId] ASC)

)

初步构想就是把进来的数据首先放入一个队列中,达到一定数量时把数据放到DataTable中,当DataTable中的数据累计到一定数量时,调用SqlBulkCopy进行入库。

先写一工具类,

public static class Util

{

public static Queue<Person> persons = new Queue<Person>();

private static DataTable dataPerson = null;

private static readonly object obj = new object();

public static DataTable DtPerson

{

get

{

if (dataPerson == null)

{

lock (obj)

{

dataPerson = CreateTable();

}

return dataPerson;

}

return dataPerson;

}

}

public static DataTable CreateTable()

{

DataTable dt = new DataTable();

DataColumn dc = null;

dc = new DataColumn();

dc.ColumnName = "Name";

dt.Columns.Add(dc);

dc = new DataColumn();

dc.ColumnName = "DateOfBirth";

dt.Columns.Add(dc);

return dt;

}

}

实体类的代码,

public class Person

{

public string Name { get; set; }

public DateTime? DateOfBirth { get; set; }

}

下面是Program类实现代码

class Program

{

static void Main(string[] args)

{

for (int i = 0; i < 100000; i++)

{

Util.persons.Enqueue(CreatePerson(i));

Console.WriteLine(" enqueue:" + i.ToString());

DataImportToDataTable();

}

Console.ReadLine();

}

public static void DataImportToDataTable()

{

if (Util.persons.Count >= 100)

{

for (int i = 0; i < 100; i++)

{

//出对数据

Person p = Util.persons.Dequeue();

Console.WriteLine("Import Data To DataTable:" + p.Name.ToString());

//写入表中

DataRow dr = Util.DtPerson.NewRow();

dr["Name"] = p.Name;

dr["DateOfBirth"] = p.DateOfBirth;

Util.DtPerson.Rows.Add(dr);

}

Console.WriteLine("Dequeue count:" + Util.persons.Count);

}

InsertTable(Util.DtPerson);

}

public static void InsertTable(DataTable dt)

{

//达到一定数量,进行入库

if (dt.Rows.Count >= 1000)

{

using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ConnectionString))

{

//打开连接

cnn.Open();

using (SqlBulkCopy sbc = new SqlBulkCopy(cnn))

{

//Person为要插入数据的表

sbc.DestinationTableName = "Person";

//字段映射。如果dt中的字段数和数据库表中的字段数不一样多 一定要进行映射

sbc.ColumnMappings.Add("Name", "Name");

sbc.ColumnMappings.Add("DateOfBirth", "DateOfBirth");

//每次加载数据的行数。不设置默认为全部,在本例中就可以不设置

sbc.BatchSize = dt.Rows.Count;

Console.WriteLine("sqlbulkcopy begin:" + DateTime.Now);

try

{

sbc.WriteToServer(dt);

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

Console.WriteLine("sqlbulkcopy end:" + DateTime.Now);

}

}

lock (Util.DtPerson)

{

Util.DtPerson.Clear();

Console.WriteLine("after clear:" + Util.DtPerson.Rows.Count);

}

}

}

public static Person CreatePerson(int id)

{

Person p = new Person

{

Name="Person"+id.ToString(),

DateOfBirth = new DateTime(1950 + (id % 50), ((id * 3) % 12) + 1, ((id * 7) % 29) + 1)

};

return p;

}

}

转载于:https://www.cnblogs.com/qiuwuyu/archive/2011/08/17/2143129.html

浅谈使用SQLBulkCopy批量数据入库相关推荐

  1. 浅谈云计算和大数据技术

    浅谈云计算和大数据技术 背景: 随着计算机技术的发展,数据量日益增长,现有技术也很难满足业务的发展需求,在代码的层层迭代和优化之后,还是很难满足数据的增长需求,迫切需要一项新的技术来从事数据计算,因为 ...

  2. 浅谈List保存的数据是引用数据类型的地址

    浅谈List保存的数据是引用数据类型的地址 今天一个初学javaweb的朋友问我一个bug,经过和别人 讨论分析了解到List对象细节上的一些问题,我将代码重新简化构造了一下做成了一个例子.上代码: ...

  3. 浅谈服务器托管至IDC数据中心的优势

    浅谈服务器托管至IDC数据中心的优势 一:网络 企业自建机房一般用的是商务光纤,本质上也是从运营商的数据中心出来的光纤,只是要经过很多交换机跳转后才能到企业的机房,所以出现故障率的概率会高一些.IDC ...

  4. MySQL开发技巧——批量数据入库及检索

    目录 第1关 MySQL数据库连接 头歌实验 第2关 数据库与数据表创建 数据表的创建 头歌实验 获取游标 数据表的创建 第3关 批量数据入库与检索 事务提交与关闭连接 头歌实验 格式化字符串 利用游 ...

  5. Educoder头歌--MySQL开发技巧 - 批量数据入库及检索

    第1关:MySQL数据库连接 connect方法的参数含义如下: host:数据库主机名,默认是用本地主机 user:数据库登陆名,默认是当前用户 passwd:数据库登陆的密码,默认为空 chars ...

  6. 浅谈通过网络和数据来“定位”一个人

    我们在看武侠小说时,总有些高手能飞天遁地,似乎无所不能,然而我们也总能发现那些如影随形的人,他们不分日月,不分四季的追踪.当今社会,也有这样的情况,追逐的战场已经变成了虚拟复杂的网络世界,根据自己的知 ...

  7. 浅谈人工智能、大数据等技术在交通领域的应用

    随着人工智能.大数据.物联网.云计算等技术的兴起与发展,各类设备.终端.系统平台等都会产生海量的数据,加之传统的处理方式已经逐渐落伍,因此,这些智能便捷化的技术便逐渐渗透到各行各业中.像交通行业随着交 ...

  8. 张钹院士:浅谈人工智能与大数据的关系

    来源:联合时报 本文共2385字,建议阅读5分钟. 本文主要浅谈了人工智能和大数据的关系以及中国在人工只能领域对世界的超越. 中国科学院院士张钹对国内外人工智能产业发展现状,提出我国仅靠跟随性的应用深 ...

  9. 浅谈Oracle 数据库之间数据同步方案

    随着信息技术的飞速发展,企业信息化建设的不断深入,使得企业业务系统数量不断增加.这时,各业务系统之间数据交互,各子业务系统与核心业务系统之间数据交互,诸如此类场景的应用需求不断出现.因此,IT部门应对 ...

最新文章

  1. oracle中“ORA-00060: 等待资源时检测到死锁” 或存储过程编译卡死 解决方法
  2. 交流潮流matlab程序,大神们,求个电力系统潮流计算的matlab程序。
  3. python支持链式赋值和多重赋值_Python: 链式赋值的坑
  4. java刘保_[SSH] Eclipse+Struts2的简单应用
  5. 动态规划练习【一】 背包问题
  6. 如何看待现在一些年轻人秉持「简单是福、平淡是真」的随遇而安的生活态度?...
  7. JavaScript使用Modbus协议实现RTU设备连云
  8. java soap服务_「java调用webservice」java调用webservice接口 三种方法 - seo实验室
  9. 庄子:谁知南华秋水意?
  10. 「流程案例」| 胡润富豪榜数据获取、分析与可视化
  11. Kubernetes中配置Pod的liveness和readiness探针
  12. 4.名词性从句的起源与本质
  13. Mariadb的基本使用(一篇涵盖基本操作)
  14. Opencv中的图像相加,相减,相除,相乘(python实现)
  15. Vue # Avoid mutating a prop directly since the value will be overwritten wheneve
  16. 传詹克团、吴忌寒将卸任比特大陆CEO一职 1
  17. 交通灯管理系统视频学习
  18. 手机在线提取视频中的音频方法
  19. 酷炫命令行背景图操作步骤
  20. Scaled-YOLOv4 简单学习笔记

热门文章

  1. java 1000个线程_java,一个程序建立1000个线程,每一个线程加1到一个变量sum。
  2. 技巧|利用 Python 实现多任务进程
  3. Python初学者必学的20个重要技巧
  4. zabbix4.0添加mysql报警_部署监控三剑客 Zabbix4.0 监控以及告警机制
  5. oracle sql 平均分配 分组_SQL学习二
  6. Spark中的内存计算是什么?
  7. KALI LINUX文件名乱码,在kali linux之下 下载并解压的文件名呈现乱码 解决方案
  8. poj3159(差分约束)
  9. Codeforces Round #649 (Div.2)题解
  10. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)