从数据库到数据库的克隆表

时间:2015-09-11 07:40:03

标签: spring spring-integration spring-batch

我需要一个解决方案,从一个数据库实例(DB1)获取整个表,并在另一个数据库实例(DB2)上创建相同的表。之前我使用过Spring Integration,但我听说Spring Batch可以更好地适应这种情况,我想尝试一下。

因此,是否有可能/有意使用Spring Batch作业,并执行以下步骤:

  1. 在DB2上创建一个空表,该表与DB1中的源表具有相同的模式。
  2. 从DB1表中选择 - >更新DB2表。如果在步骤期间smth错误 - 在DB2上回滚和删除表。
  3. 使用Spring集成我看到JdbcInboundChannelAdapter -> QueueChannel -> OutboundGateway可能的解决方案,但是Spring Batch可能是更好的选择吗?任何建议都非常赞赏。

2 个答案:

答案 0 :(得分:1)

这取决于您的要求。

我们最初使用spring-batch加载DWH。但这不是一个简单的一对一副本。生产数据库中的数据存储在垂直表设计(aka entity-attribute-value-model)中。此外,每个条目也是双时态的历史。总而言之,这些行大约有5&000,000和000,000行,必须根据正确的时间维度进行分组并转换为水平数据库设计。当然,这是从DB2到Oracle。

所以我们必须显着转换结构,必要时我们必须转换数据类型,我们有50亿行要处理。

如果你在同一个数据库系统中只有一个普通的1:1副本,那么最简单的方法就是使用数据库工具。

如果必须在不同的数据库系统之间进行转移,可以选择弹簧批量。

如果您必须转换结构或类型的数据,可以选择弹簧批。

如果你有很多行,你可以使用spring批处理的分区功能来并行化,或者只是用不同的id-range启动相同的工作几次。

如果要复制多个表,可以使用拆分流并行加载各个表中的数据。

在我目前正在与之合作的公司,我们拥有完全通用的文件/ Db读写器,它们完全基于数据库元模型。如果我想做一个简单的复制工作,我只需要将源和目标数据源与所需的表一起定义,并适当地初始化读者和编写者。如果名称匹配,我甚至不必添加配置来映射表之间的数据。

这引出了以下基本问题

  1. 需要什么样的转换逻辑?如果有的话?
  2. 需要什么样的表现?
  3. 必须复制多少个表?
  4. 是同一系统的源和目标吗?

答案 1 :(得分:1)

我已使用我在其他帖子中描述的配置解决了我的任务:How should I use .tasklet() / .chunk() to finish job succesfully?。谢谢大家!