【问题标题】:c# - pull records from database without timeoutc# - 从数据库中提取记录而不超时
【发布时间】:2011-02-15 07:15:06
【问题描述】:

我有一个带有多个连接的 sql 查询,它从数据库中提取数据进行处理。这应该在某个计划的基础上运行。所以第 1 天,它可能会拉 500,第 2 天说 400。

现在,如果服务因某种原因停止并且数据未处理,那么在第 3 天可能有多达 1000 条记录需要处理。这导致 sql 查询超时。

如何最好地处理这种情况而不会导致超时并逐渐减少要处理的工作量?

TIA

【问题讨论】:

    标签: c# sql database-design timeout


    【解决方案1】:

    创建一个批处理。只允许处理 n 条记录。假设 n = 100 ... 然后让您的选择查询只选择前 100 个,直到没有更多记录要处理。

    YourCommandObject.CommandTimeout = 0;
    

    这将使您的命令永远运行。

    请注意,这可能会导致数据库锁定和其他问题。如果您使用我上面描述的批处理并确定运行时间最长的查询,您可以将连接超时设置为必要的值。

    【讨论】:

    • 连接超时控制建立连接;它不会影响查询在超时之前可以运行多长时间
    • 对不起你的权利我的意思是说命令超时......废话,那是在命令对象中......我搞砸了
    【解决方案2】:

    一个实用的解决方案是增加命令超时:

    var com = yourConnection.CreateCommand();
    com.CommandTimeout = 0;
    ...
    

    CommandTimeout 属性是等待命令执行的时间(以秒为单位)。默认值为 30 秒。值 0 表示没有限制,应避免在 CommandTimeout 中使用,因为尝试执行命令将无限期等待。

    【讨论】:

      【解决方案3】:

      查看您的查询,可能是它没有优化,在适当的地方放置索引。没有看到你的表结构,查询,不能再帮助了。

      【讨论】:

      • 是的。这是最好的开始 - OP 的数字表示繁重的残酷工作或完全蹩脚的查询。不应发生只有 1000 个结果的超时。
      • @TomTom:查询成本和结果数量之间没有关系。具有 1000 个结果的查询可能需要任意数量的计算和/或磁盘 I/O
      • 正如我所说的 - 要么是繁重的工作,要么是糟糕的索引。存在统计关系 - 平均 1000 个结果的资源密集度低于 10.000.000 个。大多数查询下的 1000 个结果应该在几秒钟内出现。鉴于结果中的数据量很少,指向优化是一个有效的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多