我有一个存储更新语句的类。我无法在并行for循环中执行这些语句,因为这会导致死锁。
语句在循环完成后执行,在100行的场景中它可以正常工作。但某些情况会产生 100,000 语句。在顺序循环上执行这些语句需要很长时间。
我希望实现的是,在向类中添加100个语句后,我在一个单独的线程上执行这些语句,并清除语句变量,以便可以添加和执行下一个语句。
我是多线程新手。这可以实现吗?如果不是我用什么其他选项来减少执行时间。请注意,我无法更改语句逻辑,因为还有许多其他因素。
让我进一步澄清我的情景。我拥有的这个表更像是一个日志表,它跟踪转移到客户端的sql行,因此我不会重新发送同一个对象两次。这是为了减少带宽使用,因为对象通过互联网链接传输。
一旦我收到客户的回复,我就会执行每个声明。当循环顺序时,这很有效,但事实证明它太慢了。所以我选择使用parallel for循环。这是所有问题出现的地方,因为同一个表几乎同时被选中,插入和更新导致死锁。
所以我决定将语句保存在稍后执行的字符串列表中。
我尝试使用string.join将所有字符串转换为单个字符串,但这给了我系统内存不足的异常。从而逐个顺序执行它们。现在转移需要5分钟,执行需要30分钟。所以我正在寻找解决方案......
答案 0 :(得分:2)
由于听起来您不断地继续将新内容插入到数据库中,因此您可以使用SqlTransaction
,只要它们可用,您就可以在其上执行语句。然后,偶尔提交交易。
检查MSDN以获取有关如何使用它的示例。
编辑:如果你另一方面在一个堆中获得了很多要执行的语句,请尽可能使用SqlBulkCopy,就像LoztInSpace所说的那样。
答案 1 :(得分:1)
我在将SQLBulkCopy用于临时表然后对其执行UPDATE(实际上是MERGE,但原理相同)方面取得了巨大的成功。
我们有5分钟的时间缩短到几秒钟。