7

我有一个存储更新语句的类。我无法在我的并行 for 循环中执行这些语句,因为这会导致死锁。

一旦循环完成,语句就会执行,在 100 行的情况下它可以正常工作。但某些场景会生成超过100,000 条语句。在顺序循环上执行这些语句需要很长时间。

我希望实现的是,在类中添加 100 条语句后,我在单独的线程上执行这些语句,并清除 statements 变量,以便可以添加并执行接下来的 100 条。

我是多线程的新手。这是可以实现的吗?如果不是我使用什么其他选项来减少执行时间。请注意,我无法更改语句逻辑,因为它附加了许多其他因素。

让我进一步澄清我的情况。我拥有的那个表更像是一个日志表,它跟踪传输到客户端的 sql 行,因此我不会重新发送相同的对象两次。这是为了减少通过 Internet 链接传输对象时的带宽使用量。

最初,我在收到客户回复后立即执行每条语句。当循环是连续的时,这很有效,但被证明太慢了。所以我选择使用并行 for 循环。这是所有问题都出现的地方,因为几乎同时从同一个表中选择、插入和更新导致死锁。

所以我决定将语句保存在字符串列表中,以便稍后执行。

我尝试使用 string.join 将所有字符串转换为单个字符串,但这给了我系统内存不足异常。从而一个一个地依次执行它们。现在转移需要 5 分钟,执行需要 30 分钟。所以我正在寻找解决方案..

4

2 回答 2

2

由于听起来您不断地将新内容插入到数据库中,因此您可以使用 a SqlTransaction,只要它们可用,您就可以在其上执行语句。然后,偶尔提交事务。

查看MSDN以获取有关如何使用它的示例。

编辑:另一方面,如果您在一个堆中执行很多语句,请尽可能使用 SqlBulkCopy,就像 LoztInSpace 说的那样。

于 2013-06-07T14:24:47.210 回答
1

我在将SQLBulkCopy用于临时表然后对其执行 UPDATE 方面取得了巨大成功(实际上是 MERGE,但原理相同)。

我们将 5 分钟的批次缩短到几秒钟。

于 2013-06-07T14:25:24.160 回答