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

.net net中长时间运行的数据库操作,.net,sql-server,ado.net,.net,Sql Server,Ado.net,我有一个分隔文件,用于通过.net应用程序插入/更新sql server表中的记录。 该文件有大约80000条记录,每天都在处理。 我的问题是:在我旋转80000行中的每一行时,保持与db的连接处于打开状态是安全的还是明智的,还是应该关闭连接并在循环的每次迭代中重新打开?这听起来很麻烦。 但是,我担心长时间保持打开的连接、锁定和不必要地使用内存。 有什么更具可扩展性、更安全、更合理的方法可以做到这一点?首先,不,您不应该每行打开/关闭连接。对于80000行,这将花费很长时间,只会增加开销。你可以

我有一个分隔文件,用于通过.net应用程序插入/更新sql server表中的记录。 该文件有大约80000条记录,每天都在处理。 我的问题是:在我旋转80000行中的每一行时,保持与db的连接处于打开状态是安全的还是明智的,还是应该关闭连接并在循环的每次迭代中重新打开?这听起来很麻烦。 但是,我担心长时间保持打开的连接、锁定和不必要地使用内存。
有什么更具可扩展性、更安全、更合理的方法可以做到这一点?

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

其次,从.Net应用程序向数据库插入/更新这么多行的正确方法是使用,而不是使用insert或update命令。您应该使用SQLBulkCopy将数据行加载到保留/暂存表中,然后使用SQL存储过程对实际表进行大规模插入/更新

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


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

我曾经需要导入数据。但我必须对它运行一些小型业务规则。 在我的需求中,还需要导入尽可能多的行,但如果有任何行失败,请记录它(但不要使整个导入失败)

我把样本写在下面

我将N个记录(例如N=1000)作为~xml传递给存储过程

N应该是可配置的,以找到“最佳点”。但是一次一个太慢了,在很多人看来,一次有80000个。1000(行)x 80“运行”。。。。这是一个很好的起点,伊姆霍

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

另一种选择:

bcp.exe


但这并不是真正的“网络代码”。

请定义“长时间”:小时?这是否在一个事务内运行?你指的是什么锁?在sql或应用程序服务器中,您在哪里用完了内存?我不敢要求详细说明更具可扩展性和安全性的问题……目前,我测试的样本只需要大约一个小时即可完成。但是,如果在我将其移动到生产环境时实际文件会增长,那么它会更长。我没有使用单个事务。您的sqlserver是否已达到最大值?它能处理一个额外的工人吗?顺序重要吗?该表位于一个数据库中,在任何给定时间,平均有10-15个(有时更多)用户的企业应用程序可以访问该数据库。企业数据库有自己的计划任务,这些任务在一天中的不同时间运行。我假设所有这些都已经在sql server上造成了负载。我的进程需要在windows中作为计划任务运行。我不认为sql server已经用完了,但我只是不想冒险。我想顺序并不重要。读取每一行,将每一行放入msmq,启动一个读取队列并存储到sql中的工作进程,只要进程时间减少,就继续添加工作进程……工作进程可以是appserver上的线程,也可以是不同appserversSo上的进程,这是VS2005的一个示例。老兄,我老了!如果我今天这么做,我会的。(1) 使用VS2010(至少)。(2) 更改EnterpriseLibrary v5,它已经具有现成的OleDb功能,(3)更改我的TSQL,使其不使用OPENXML,而是使用“节点”语法。示例如下: