1、数据库连接池:在同时连接数不多的情况下,
打开一个链接往数据库导1W条数据的耗时
跟
导一条数据就打开跟关闭数据库连接的耗时
两者其实相差不大,这是为什么呢?打开关闭的本身不是有很多耗时吗?这是因为数据库连接池的存在
当你同时连接数打开的不多的情况下,你关闭一个链接,实际上,这个链接并没有关闭,而是被.Net偷偷藏起来,当然这个藏起来的链接数数量
是有限定的,所以当你导一条,打开关闭一个链接这种方式导数据时,其实并未真正在“打开关闭连接”。
2、批量数据提交:SqlBulkCopy类 以读取号码归属地这样一个文本为例
首先是把数据读取进来,放到一个本地大集合DataTable中,然后再把这个table扔到数据库中
DataTable table = new DataTable();
table.Columns.Add("TelNum");//自己定义的table里面的列名,任意取
table.Columns.Add("City");
table.Columns.Add("TelType");
for(int i = 0;i < lines.Length; i ++)//lines是已经从打开的文本中读取到的集合,一行为单位
{
//获取需要往数据库填的字符串
string line = lines[i];
string[] strs = line.Split(‘/t‘);//VS里‘/t‘为制表符 以制表符来分割
string telNum = strs[0];
string city = strs[1].Trim(‘"‘);//去掉两边的双引号 :"北京市"
string telType = strs[2].Trim(‘"‘);
//然后把数据填充到DataTable中,不过这里需要用到DataRow对象
DataRow row = table.NewRow();
row["TelNum"] = telNum ;//一定要在一开始创建table.Columns添加列
row["City"] = city ;
row["TelType"] = telType ;
//然后把Row跟Table关联起来
table.Rows.Add(row);
}
//以上操作已经把从文本读到的数据填充到了DataTable中,接下来该把表扔到数据库里了
using(SqlBulkCopy bulk = new SqlBulkCopy(ConnStr))
{
bulk.DestinationTableName = "T_TelNum";//数据库中存数据的表名
//第一个参数是DataTable中自己定义的列名,第二个参数是数据库表中定义的列名,
//两个表的列关联起来 (映射!)
bulk.ColumnMappings.Add("TelNum","TelNum");
bulk.ColumnMappings.Add("City","TelArea");
bulk.ColumnMappings.Add("TelType","TelType");
bulk.WriteToServer(table);//前期工作做完,把DataTable扔到数据库中。
}
不用这个类,20分钟。用这个类9秒钟~~~~~~~醉醉哒
个人理解:先把数据填到本地数据集DataTable,这样都在本地进行,只是读取字符串,然后一次性的把数据扔到数据库。
而直接把数据一条条读到数据库中,其中涉及的内部操作,代码量显然是巨大的。
两者的数据量相同,所以我认为,时间相差这么多,是花在与数据库相互中产生的大量代码量。(也不知道这么说合不合适,给自己看的- -)