从一个数据库复制具有数百万条记录的表 - Spring Boot + Spring JDBC

时间:2017-06-28 18:29:44

标签: java spring spring-boot spring-jdbc

处理一个必须从中复制数百万条记录的小例子 teradata数据库到Oracle DB。

环境:Spring Boot + Spring JDBC(jdbcTemplate)+ Spring REST + Spring Scheduler + Maven + Oracle + Teradata

使用Spring JDBC的batchUpdate将数据插入目标数据库Oracle。

在源数据库的SQL查询中使用teradata的“前1000名”。

fecthDataResults = repository.queryForList(
                "select top 1000 A, B, C, D, E from " + schemaName + ".V_X");

从视图“V_X”查询。

此视图有4000万条记录,弹出启动应用程序如果运行则会阻塞。

还在目标Oracle DB中插入2个表(主表和备份表)。

什么是获取和加载/复制4000万条记录的最佳方法,确保将复制成功完成到2个表格中。

Spring Scheduler以指定的时间/间隔计划批量复制。 Spring Rest可以手动调用复制 - 两者都可以实现。

任何建议将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:3)

您可以通过不同的方式解决此问题:

  1. Logstash方法 - 指定源和目标数据并将数据加载到目标DB。它具有cron支持,并且logstash可以根据计划运行。它要快得多。您可以指定每次要获取的行数。

  2. 使用ETL工具。如果您确实拥有生态系统,则可以使用任何开源版本。 Talend是一个很好的候选人,你可以设计你的工作并导出为可运行的Jar。您可以使用您选择的任何组件来安排此操作。

  3. Spring Batch。请参考这个问题。 Spring RESTful web services - High volume data processing

  4. Spring云数据流或Spring引导,MQ作为数据源之间的中间存储。您可能必须引入消息队列来处理故障转移,回退机制。高度可靠,可以以异步方式实现。

  5. 我个人的意见是与Logstash一起使用。如果您认为上述任何解决方案都有意义。如果你愿意,我可以详细说明。

答案 1 :(得分:0)

在您提供的信息的基础上以及所选择的堆栈之后,在我看来,您有两种可能性,首先使用spring batch创建一个项目,另外还有spring batch admin或spring integration来处理休息。第二个实际上使用Spring XD在大数据概念中使用第一个解决方案。我建议您使用分析器尽可能地加快性能。