【发布时间】:2012-06-06 19:10:50
【问题描述】:
我有一个数据库表,其中包含一些要处理的记录。该表有一个标志列,表示以下状态值。 1 - 准备好处理,2 - 成功处理,3 - 处理失败。
.net 代码(重复过程 - 控制台/服务)将获取准备处理的记录列表,并循环通过它们并尝试处理它们(不是很长),根据成功或失败更新状态.
为了获得更好的性能,我想为此进程启用多线程。我正在考虑生成 6 个线程,每个线程抓取一个子集。
显然我想避免让不同的线程处理相同的记录。我不想在数据库中有一个“正在处理”标志来处理线程崩溃导致记录挂起的情况。
我看到这样做的唯一方法是获取可用记录的完整列表并为每个线程分配一个组(可能是 id)。如果一个单独的线程失败了,它的未处理记录将在下次进程运行时被拾取。
在将组分配给线程之前,是否有其他方法可以划分组?
【问题讨论】:
-
你的表中有标识列吗?
-
您真的不应该将数据库用作队列。 en.wikipedia.org/wiki/Database-as-IPC
-
@Oded:我同意事务队列是一个更好的主意,但是您链接到的反模式说使用数据库是一种反模式,例如可以使用套接字。正确的想法,虽然不是一个完美的参考。
-
@Oded,维基百科链接和那里发布的文章都没有为 db 作为队列提供真正的替代方案。编写“改为使用套接字”非常简单,但这意味着什么?您应该如何处理事务(成功或失败/重试),例如,使用套接字?人们没有在数据库中正确排队/处理项目的事实(正如那里的链接所解释的那样)并不意味着这个想法本身就是反模式,尤其是在 99% 的情况下,您希望已处理的项目保留在那里进行归档。跨度>
-
@YavgenyP:确实,如果我没记错的话,事务模式下的 MSMQ 使用 SQL 服务器作为持久性机制 :-)
标签: c# .net multithreading windows-services