使用ms sql-server实现master-worker方法的最佳方法是什么?即,一个java进程( master )将数据放入表中,一个或多个java进程( worker )从表中检索此数据,处理它并更新正在检索的记录中的一些字段。
为避免sql-server锁定,哪种方法更可行实现?
方法1: 单个主将数据插入一个表中,一个工作人员检索它,处理和更新正在检索的记录中的状态标记。
方法2: 每个工作人员都有自己的表格,而单个主人会在表格中分配数据。每个 worker 从它自己的表中检索数据,处理它并更新状态标志。
就我而言,有一种 NO 方式来强制执行sql-server锁定记录的方法。它只能提供一些提示。如果是这样,第二种方法是否可以接受?
编辑:
@Matt Ball: Java进程可能只是一个线程。并且锁不是线程锁,而是sql-server记录/页/表锁。
我想避免使用sql-server锁或减少它们以提高性能。
感谢。
答案 0 :(得分:3)
您无法避免数据库锁定,这就是大多数商业关系引擎保证ACID属性的方式。话虽如此,正如马丁指出的那样,你所希望的确是一个队列。队列是生产者 - 消费者或主人 - 工人模式的基石。由表支持的队列是可行的并且可以扩展得非常高:数百个concurent enqueue / dequeue操作是非常可行的。 Martin链接的文章详细解释了如何做到这一点。
每个工作人员或每个工作人员不需要单独的队列。每个工作人员分成一个表只会产生操作障碍:有多少个表?如果我添加一个工人怎么办?如果工人超载怎么办?如何将待处理的工作转移给另一个工作?如何在闲置期间关闭工人?单个队列是最好的方法,因为您可以动态地添加/减少工作人员数量,而无需执行昂贵的数据库操作(添加新表,传输现有工作等)。单个表格还允许多个工作人员自然地对工作进行负载平衡。
虽然技术上可行,但我建议不要做一个基于状态的表(状态'处理',状态'处理')。请使用真正的队列,当工作人员将其删除时,将删除记录。如果需要持久状态,请使用表作为状态和事件队列。排队的信息应包含要处理的ID。