在多个进程之间均匀分配数据库记录

时间:2012-07-16 16:48:34

标签: java multithreading

我有一个包含300万条记录的数据库表。 java线程从表中读取10,000条记录并对其进行处理。处理后,它会跳到下一个10,000,依此类推。为了加快速度,我有25个线程执行相同的任务(读取+处理),然后我有4个物理服务器运行相同的java程序。所以我有100个线程做同样的工作(阅读+处理)。

我使用的策略是使用一个sql过程来完成抓取下一个10,000条记录并将它们标记为由特定线程处理的工作。但是,我注意到线程似乎在等待一段时间试图调用该过程并获得响应。我可以使用什么其他策略来加速这一数据选择过程。

我的数据库服务器是mysql,编程语言是java

3 个答案:

答案 0 :(得分:3)

处理此类场景的惯用方法是设计模式。在Java中实现它的惯用方法是使用

基本上,您需要一个主服务器读取记录并将它们推送到JMS队列。然后,您将有任意数量的消费者从该队列中读取并相互竞争。您需要如何详细实现这一点:您要发送包含完整记录还是仅包含ID的消息?一条消息或记录中的所有10000条记录?

另一种方法是,请查看。但学习曲线有点陡峭。

答案 1 :(得分:2)

对我来说听起来像是Hadoop的工作。

答案 2 :(得分:2)

我怀疑你是这个方案的主要数据库IO。如果您尝试提高系统性能,我建议您在多个数据库服务器上划分数据(如果可以的话)。 MySQL has some partitioning modes我没有经验。如果你自己进行分区,它会给数据库模式增加很多复杂性,你必须使用散列机制添加某种路由层,以便以某种方式在多个分区之间划分记录。但是我怀疑你的速度会有很大的提升,你的线程也不会等待得那么多。

如果您无法对数据进行分区,那么将数据库移动到SSD memory drive将是一个巨大的胜利,我怀疑 - 任何可以提高这些分区上IO速率的东西。由于固有的性能问题,请远离RAID5。如果您需要一个可靠的文件系统,那么镜像或RAID10会有更好的性能,RAID50也可以作为大分区的选项。

最后,如果您正在颠覆数据库IO总线,您可能会发现应用程序在使用较少线程时性能更佳。这取决于许多因素,包括并发查询,数据库布局等。您可以尝试调低每个客户端的线程数以查看是否有所不同。然而,效果可能很小。