2013-02-11 72 views
2

我有一个分隔文件,我用它通过.net应用程序在sql server表中插入/更新记录。 该文件包含约80000条记录,并且每天都进行处理。 我的问题:当我旋转80000行的每一行时,是否保持打开数据库的连接是安全的或者明智的,还是应该关闭连接并重新打开循环的每次迭代?这听起来很麻烦。 但是,我担心长时间保持开放连接,锁定并不必要地占用内存。 什么是更具扩展性,安全和明智的方式来做到这一点?在.net中长时间运行数据库操作

+0

请定义'很长时间':小时?这是在一个事务中运行吗?你指的是什么锁?你在哪里使用内存,在SQL或在应用程序服务器?我不敢要求详细说明更具可扩展性和安全性...... – rene 2013-02-11 19:27:50

+0

目前我用于测试的样品只需要大约一个小时即可完成。但是,如果实际文件增长时,我将它移到生产它会更长。我没有使用单个事务。 – 2013-02-11 19:33:02

+0

你的sqlserver超时了吗?它可以处理一个额外的工人吗?订单是否重要? – rene 2013-02-11 19:40:20

回答

4

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

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

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

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

2

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

我写下面的例子。

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

我向下传递的记录N个(N = 1000示例)〜XML来存储的过程。

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

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

.......

另一种选择:

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

但是,这是不是真正的 “点网码”。

+0

所以这是一个VS2005的例子。男人,我变老了!如果我今天这样做,我会的。 (1)使用VS2010(至少)。 (2)更改EnterpriseLibrary v5,它已经具有OleDb的可用性,并且(3)将我的TSQL更改为不使用OPENXML,而是使用“节点”语法。示例:http://pratchev.blogspot.com/2007/06/shredding-xml-in-sql-server-2005.html – granadaCoder 2013-02-11 21:15:10

相关问题