我在数据库(PostgreSQL)中有很多数据,需要处理所有数据。我的程序有线程来处理所有这些数据并遵循这些逻辑。
我怀疑最好的方法是如何做到这一点。我有三个想法:
创建一个在循环中运行的管理器类,从数据库获取数据并保存要处理的对象队列。创建一个在循环中运行的流程类,从Manager类中获取要处理的对象。
如上所述,但没有经理类,因此进程类将在它之间共享对象队列,他们也将负责从数据库获取数据。
一个在循环中运行的管理器类,它从数据库中获取数据,但它创建了包含要处理的数据的流程类,因此流程类不会向管理器请求任何内容。它被创建,处理和销毁,而不是循环运行。
我不知道什么是更好的,如果有另一种解决方案更有效。
答案 0 :(得分:1)
您正在描述所谓的经理 - 工人模型。我认为你的第一个描述更好。
它将数据推送到队列中,多个工作人员对其进行处理。您可以为工作人员使用线程池。工人正在排队等候。一旦工作被推送到队列,其中一个工人立即采取行动。完成后,他们可以将结果推送到传出队列,然后另一个线程将数据发送到DB。或者,每个工人都可以自己保存结果这取决于你,取决于你的任务。
User Excecutors和BlockingQueue实现。您只需要java.util.concurrent
包,您就可以在网上找到很多关于如何使用它们的教程和示例。
答案 1 :(得分:0)
虽然你的第一个建议是好的,但我会尝试简化它
创建一个在循环中运行的管理器类,从数据库获取数据并保存要处理的对象队列。创建一个在循环中运行的流程类,从管理器类中获取要处理的对象。
我创建了一个 manager 类,它获取了要处理的当前数据列表。然后,它创建执行程序的实例,这些执行程序只是运行在创建时提供的单个数据集。然后他们退出。
管理器负责产生循环,或者迭代它在给定时间知道的数据集。我将进一步抽象出来,并有一个计划任务定期创建一个管理器来处理新的数据集。
这样做的原因是它简化了并发编程。 数据集处理器只能识别一组数据,您可以对其进行编程,就好像它不知道并发一样。它得到一份工作,处理它,而且已经完成了。
同样对于经理来说,它获取一组数据,通过创建处理器来处理它,并且已经完成。
这个难题的最后一部分是确保没有两个经理允许多个实例被分配相同的数据集。如果你只创建一个单独的线程池来运行管理器,那么可能最容易理解。如果预定的时间到了并且还有一个管理器正在运行,那么你就不会创建一个新的。