做一个项目,因为每十分钟都要做一次大容量的数据导入,于是使用BULK进行。在sqlServer的存储过程里写了BULK Insert语句后,运行一段时间很正常,以为没有什么问题了,没想程序运行了两周后,sqlServer占用的内存狂大,整个系统运行缓慢,查了一些资料,发现是BULK在存储过程中运行,会造成内存泄漏。后参考http://weblogs.sqlteam.com/mladenp/archive/2006/08/26/11368.aspx,用.NET2.0里提供的BULKcopY来实现大容量数据导入功能,大体源代码如下:
private void StartImport() { Stopwatch sw = new Stopwatch(); sw.Start(); sqlBulkcopy bulkcopy = new sqlBulkcopy("Server=ServerName;Database=test;Trusted_Connection=True;",
sqlBulkcopyOptions.TableLock); bulkcopy.DestinationTableName = "dbo.testsqlBulkcopy"; bulkcopy.WritetoServer(CreateDataTableFromFile()); sw.Stop(); txtResult.Text = (sw.ElapsedMilliseconds/1000.00).ToString(); } private DataTable CreateDataTableFromFile() { DataTable dt = new DataTable(); DataColumn dc; DaTarow dr; dc = new DataColumn(); dc.DataType = System.Type.GetType("@R_502_3557@t32"); dc.ColumnName = "c1"; dc.Unique = false; dt.Columns.Add(dc); dc = new DataColumn(); dc.DataType = System.Type.GetType("@R_502_3557@t32"); dc.ColumnName = "c2"; dc.Unique = false; dt.Columns.Add(dc); dc = new DataColumn(); dc.DataType = System.Type.GetType("@R_502_3557@t32"); dc.ColumnName = "c3"; dc.Unique = false; dt.Columns.Add(dc); dc = new DataColumn(); dc.DataType = System.Type.GetType("@R_502_3557@t32"); dc.ColumnName = "c4"; dc.Unique = false; dt.Columns.Add(dc); StreamReader sr = new StreamReader(@"d:/work/test.txt"); string input; while ((input = sr.ReadLine()) != null) { string[] s = input.Split(new char[] { '|' }); dr = dt.NewRow(); dr["c1"] = s[0]; dr["c2"] = s[1]; dr["c3"] = s[2]; dr["c4"] = s[3]; dt.Rows.Add(dr); } sr.Close(); return dt; }
思路是将数据先存入内存中的一张临时表,再用BULKcopY把临时表中的数据导入到真正的数据表中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。