【问题标题】:long running database operations in .net.net 中长时间运行的数据库操作
【发布时间】:2013-02-11 19:22:43
【问题描述】:

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

【问题讨论】:

  • 请定义“很长时间”:小时?这是在一个事务中运行吗?你指的是什么锁?你在哪里用完内存,在 sql 中还是在应用程序服务器中?我不敢要求详细说明更具可扩展性和安全性......
  • 目前我有用于测试的样本大约需要一个小时才能完成。但是,如果当我将它移到生产环境时实际文件会增长,它会更长。我没有使用单笔交易。
  • 你的 sqlserver 是否已满?它可以处理一名额外的工人吗?顺序重要吗?
  • 该表位于一个企业应用程序访问的数据库中,在任何给定时间平均约有 10-15 [有时更多] 用户。企业数据库有自己的计划任务,这些任务在一天中的不同时间运行。我会假设所有这些都已经在 sql 服务器上造成了负载。我的进程需要在 Windows 中作为计划任务运行。我不认为 sql server 已经用尽了,但我只是不想冒险。我想顺序并不重要。
  • 读取每一行,将每一行放在一个 msmq 中,启动一个读取队列并存储到 sql 中的工作人员,只要处理时间减少就继续添加工作人员......工作人员可以一个应用服务器上的线程,或不同应用服务器上的进程

标签: .net sql-server ado.net


【解决方案1】:

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

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

如果您担心 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 应该是可配置的,以找到“最佳位置”。但是一次一个太慢了,一次80,000似乎很多。 1,000(行)x 80“运行”....是一个很好的起点,恕我直言。

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

    .......

    另一种选择:

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

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

    【讨论】:

    • 这是一个 VS2005 的例子。伙计,我老了!如果我今天这样做,我会的。 (1)使用VS2010(至少)。 (2) 更改 EnterpriseLibrary v5,它已经具有开箱即用的 OleDb 功能和 (3) 更改我的 TSQL 以不使用 OPENXML,而是使用“节点”语法。此处示例:pratchev.blogspot.com/2007/06/…
    猜你喜欢
    • 2019-06-16
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2011-11-30
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多