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

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

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

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

让我进一步阐明我的情况。我拥有的那个表更多是一个日志表,该表跟踪传输到客户端的sql行,这样我就不会重复发送同一对象两次。这是为了在通过Internet链接传输对象时减少带宽使用。

最初,我一收到客户的答复,便立即执行每条语句。当循环是顺序的时,此方法效果很好,但事实证明它太慢了。所以我选择使用并行循环。在这里,从同一时间选择,插入和更新同一张表的所有问题几乎都同时出现,从而导致死锁。

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

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

最佳答案

由于听起来好像您一直在不断向数据库中插入新内容,因此可以使用SqlTransaction,只要有可用语句就可以在其上执行语句。然后,您不时提交事务。

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

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

09-30 13:04
查看更多