我有一个需求来编写一个批量作业,该作业从数据库表中获取行并基于特定条件写入其他表或使用特定值更新此行。我们使用spring和jdbc来获取结果集,并使用计划每周运行的独立Java程序遍历并处理记录。我知道这不是正确的做法,但我们必须作为临时解决方案。随着记录数量增加到数百万,我们最终会遇到内存不足的例外,所以我知道这不是最好的方法。在Java中处理数百万条数据库记录
你们中的任何人都可以推荐什么是处理这种情况的最佳方法?
使用线程并获取每个线程1000条记录并并行处理它们?
(OR)
使用任何其他批处理机制来做到这一点(我知道有弹簧批,但从来没有用过这个)
(OR)
任何其他的想法?
这可能是一种应该在“数据仓库”中完成的工作吗?数据是否可以通过某种在线系统同时访问,例如繁忙的网站?处理结果是否需要首先创建数据的进程可访问? – Marvo
大多数JDBC驱动程序不会加载查询上的整个结果集,但只会加载'fetchSize'行数。我相信只有MySQL Connector/J以不同的方式执行它,所以无论您处理多少行(假设为'FORWARD_ONLY'结果集),大多数驱动程序都不会耗尽内存。 –
调查Spring Batch框架,专门为这样的东西编写。 - http://docs.spring.io/spring-batch/ – Ram