在Java中处理数以百万计的数据库记录[关闭](Processing millions of dat

2019-09-24 07:41发布

我必须编写从数据库表获取行,并根据一定的条件,写入其他表或某一个值,更新该行批作业的要求。 我们使用Spring和JDBC来获取结果集和遍历和处理使用被安排为每周运行一个独立的Java程序的记录。 我知道这是不是做了正确的方式,但我们不得不这样做作为临时解决方案。 作为记录成长为几百万,我们将结束与内存不足异常,所以我知道这是不是最好的方法。

可以在任何的你推荐什么是处理这种情况的最好方法?

使用线程,并获取1000条记录,每个线程和并行处理吗?

(要么)

使用任何其他批处理机制来做到这一点(我知道有弹簧批,但从来没有用过这个)

(要么)

任何其他的想法?

Answer 1:

从数据库表获取行,并根据一定的条件,批作业,写入其他表或某一个值,更新该行。

这听起来像之类的事情,你应该在数据库内部做。 例如,为了获取一个特定的行,并根据一定的条件下对其进行更新,SQL有UPDATE ... WHERE ...语句 。 要写入另一张表,你可以使用INSERT ... SELECT ...

这些可能会相当复杂,但我建议在你的力量做这个数据库里面做的一切,因为拉出来的数据进行过滤这是令人难以置信的慢,违背了关系型数据库的目的。

注:确保在非生产系统,该试验第一,并实现你需要让你不用在不好的时候锁定了生产表的任何限制。



Answer 2:

你已经知道,你不能把一百万行到内存中,并对其进行操作。

你必须给他们一块以某种方式。

为什么把他们中间层? 我会考虑编写存储过程和数据库服务器上的数据进行操作。 将它带到中间层似乎并不像它买你什么。 让你的批处理作业揭开序幕,存储过程和数据库服务器做计算原地。



Answer 3:

这真的取决于你处理什么,以及如何记录。

但总体来讲,你不应该他们都加载到内存中一次,但过程与合理大小的块。



Answer 4:

与布兰登·龙一般的同意。 不过,我可能会仍然试图在存储过程来选择你的“百千万”数据集的一个子集。 否则,你会打击你的数据库的事务日志。 只要确保你仍然提交您插入或更新每隔一定的时间。

如果你不希望这样做的存储过程,只是有春天批次加载您想在一些固定的块大小(使用游标/分页阅读器)来操作记录的键,但得到的存储过程做实际工作中。 这样一来,你尽量减少传递到你的中间层同时还获得春天批次和操纵数据的数据库的性能数据的好处。



文章来源: Processing millions of database records in Java [closed]