Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 清空具有多个并发进程的数据库表_Java_Database - Fatal编程技术网

Java 清空具有多个并发进程的数据库表

Java 清空具有多个并发进程的数据库表,java,database,Java,Database,我有多个进程,它们都应该从一个表中获取一条记录,对其进行处理,并在处理时将其删除。表中的所有记录都需要以这种方式处理 确保所有流程采用不同记录且不跳过任何记录(不创建单点故障)的最佳方法是什么?使用生产者-消费者模式 使用单线程从数据库中选择要处理的行,并将其分发给将执行实际处理的N个工作线程。假设只有工人有权访问已处理的行,他们也可以执行删除。使用生产者-消费者模式 使用单线程从数据库中选择要处理的行,并将其分发给将执行实际处理的N个工作线程。假设只有工作人员有权访问已处理的行,他们也可以执行

我有多个进程,它们都应该从一个表中获取一条记录,对其进行处理,并在处理时将其删除。表中的所有记录都需要以这种方式处理


确保所有流程采用不同记录且不跳过任何记录(不创建单点故障)的最佳方法是什么?

使用生产者-消费者模式


使用单线程
从数据库中选择要处理的
行,并将其分发给将执行实际处理的N个工作线程。假设只有工人有权访问已处理的行,他们也可以执行删除。

使用生产者-消费者模式


使用单线程
从数据库中选择要处理的
行,并将其分发给将执行实际处理的N个工作线程。假设只有工作人员有权访问已处理的行,他们也可以执行
删除

我过去这样做的方式是将“status”和“worked\u id”列添加到正在处理的表中。记录的状态将从“未处理”变为“正在处理”再变为“完成”

然后,每个线程按照以下方式开始工作:

update table 
set    status = processing, 
       worker_id = <<my thread ID>>
where  status is null
and    <<some way to select the rows you want to process>>
更新表
设置状态=处理,
工人id=
其中状态为空
及
线程处理该行;然后,一旦完成:

delete from table
where  status = processing
and    worker_id = <<my thread ID>>
and    <<some way to select the rows you just processed>>
从表中删除
其中状态=处理
和工人_id=
及
通过将状态存储在数据库中,您可以创建一个健全性检查——例如,当应用程序启动和结束时,您应该没有处于“处理”状态的行。如果应用程序崩溃,您可以找到受影响的行。然后,您可以决定要做什么—您可能需要整理输出—但通过将其标记为“未处理”,您可以重新运行流程


如果将语句包装在事务中(您可能会执行比本示例更复杂的逻辑),则可以保证原子性。

我过去这样做的方式是将“status”和“worked_id”列添加到正在处理的表中。记录的状态将从“未处理”变为“正在处理”再变为“完成”

然后,每个线程按照以下方式开始工作:

update table 
set    status = processing, 
       worker_id = <<my thread ID>>
where  status is null
and    <<some way to select the rows you want to process>>
更新表
设置状态=处理,
工人id=
其中状态为空
及
线程处理该行;然后,一旦完成:

delete from table
where  status = processing
and    worker_id = <<my thread ID>>
and    <<some way to select the rows you just processed>>
从表中删除
其中状态=处理
和工人_id=
及
通过将状态存储在数据库中,您可以创建一个健全性检查——例如,当应用程序启动和结束时,您应该没有处于“处理”状态的行。如果应用程序崩溃,您可以找到受影响的行。然后,您可以决定要做什么—您可能需要整理输出—但通过将其标记为“未处理”,您可以重新运行流程


如果将语句封装在事务中(您可能会执行比本示例更复杂的逻辑),则可以保证原子性。

您使用的是哪种DBMS?听起来您希望将任务队列分配给下一个可用的使用者。实际上,我不知道我现在要使用的DBMS,但很可能是DB2。您使用的是哪种DBMS?听起来您希望将一个任务队列分配给下一个可用的使用者。实际上,我不知道我现在要使用的DBMS,但很可能是DB2。谢谢,我想了想,但这会造成单点故障。这是我真正需要避免的。此外,它将是独立的进程,而不是java线程。我编辑了这个问题来反映这一点。线程或进程都无关紧要。无论哪种方式,您都需要某种类型的同步,这将是单点故障。谢谢,我认为这会导致单点故障。这是我真正需要避免的。此外,它将是独立的进程,而不是java线程。我编辑了这个问题来反映这一点。线程或进程都无关紧要。无论哪种方式,您都需要某种类型的同步,这将是单点故障。如果不提交更新,这是否有效?因为如果任何一个进程崩溃,这需要回滚,以便记录可以由另一个进程获取。如果不提交更新,这会起作用吗?因为如果任何一个进程崩溃,这需要回滚,以便记录可以由另一个进程获取。