在.net中长时间运行数据库操作

时间:2013-02-11 19:22:44

标签: .net sql-server ado.net

我有一个分隔文件,用于通过.net应用程序在sql server表中插入/更新记录。 该文件有大约80000条记录,每天处理。 我的问题:当我遍历80000行中的每一行时,保持与数据库的连接打开是安全的,甚至是明智的,还是应该关闭连接并重新打开循环的每次迭代?这本身听起来很麻烦。 但是,我担心长时间保持打开连接,持有锁并不必要地占用内存。 什么是更具可扩展性,安全性和合理性的方法呢?

2 个答案:

答案 0 :(得分:4)

首先,不应该每行都打开/关闭连接。对于80,000行,这将花费很长时间,只会增加开销。您可以考虑对行进行批处理(重置连接说每10-500行)。幸运的是,有一个更好的选择:

其次,从.Net应用程序将多行插入/更新到数据库的正确方法是使用SQLBulkCopy methods,而不是INSERT或UPDATE命令。您应该使用SQLBulkCopy将数据行加载到holding / staging表中,然后使用SQL存储过程对实际表格进行插入/更新,按原样。

如果您担心SQLBulkCopy的持续负载,它会内置批处理选项。

使用这种技术,数据的初始上传速度应该至少快5倍,而实际的表格插入/更新应该只需几秒钟。

答案 1 :(得分:2)

我曾经需要导入数据。但我不得不对它运行一些迷你业务规则。 另外在我的要求是导入尽可能多的行,但如果有任何失败,请记录它(但不要使整个导入失败)。

我在下面写了这个样本。

http://granadacoder.wordpress.com/2009/01/27/bulk-insert-example-using-an-idatareader-to-strong-dataset-to-sql-server-xml/

我将~nml的N条记录(例如N = 1000)传递给存储过程。

N应该是可配置的,以找到“甜蜜点”。但是,一次一个太慢,一次似乎有80,000个。 1,000(行)x 80“运行”....是一个很好的起点,恕我直言。

因此,如果您的导入是“哑”,那么之前建议的“SQLBulkCopy”可能是最好的方法。 但如果您有任何检查或验证,那么我的样本可能是一个很好的建议。

.......

另一种选择:

http://msdn.microsoft.com/en-us/library/ms162802.aspx 的Bcp.exe

但那不是真正的“点网代码”。