spring用Java处理数百万条数据库记录
我需要编写一个批处理作业,从数据库表中获取行,并根据特定条件写入其他表或使用特定值更新此行。我们使用spring和jdbc获取结果集,并使用一个计划每周运行的独立java程序迭代和处理记录。我知道这不是正确的方法,但我们必须把它作为一个临时解决方案。随着记录增长到数百万,我们最终会出现内存不足的异常,所以我知道这不是最好的方法
你们有谁能推荐处理这种情况的最佳方法吗
使用线程,每个线程获取1000条记录,并并行处理它们
(或)
使用任何其他批处理机制来实现这一点(我知道有spring批处理,但从未使用过它)
(或)
还有其他想法吗
# 1 楼答案
您已经知道,无法将一百万行放入内存并对其进行操作
你必须以某种方式把它们切碎
为什么要把他们带到中层?我会考虑编写存储过程并对数据库服务器上的数据进行操作。把它带到中间层似乎并没有给你买任何东西。让批处理作业启动存储过程,并在数据库服务器中进行适当的计算
# 2 楼答案
这听起来像是你应该在数据库中做的事情。例如,为了获取特定的行并根据特定条件更新它,SQL使用^{} statement 。要写入另一个表,可以使用^{}
这些可能会变得相当复杂,但我建议在数据库中尽你所能做到这一点,因为将数据提取出来进行过滤的速度非常慢,而且会破坏建立关系数据库的目的
注意:请确保首先在非生产系统上进行试验,并实施所需的任何限制,以免在不好的时候锁定生产表