Java ETL过程

我有一个新的挑战是从Oracle数据库加载~100M行并将它们插入远程MySQL数据库服务器。

我把问题分成两部分:

  1. 服务器端REST服务器,负责将数据加载到MySQL服务器;
  2. 负责加载Oracle数据源的客户端Java应用程序。

在Java方面,我使用普通的JDBC来加载分页内容并通过网络将其传输到服务器。 这种方法效果很好,但是由于我使用Oracle的ROWNUM ….. WHERE ROWNUM> x和ROWNUM <y进行分页,因此代码繁琐而且不具有很大的可扩展性。

我现在尝试了Hibernate的StatelessSession,我的实体通过Annotations映射。 代码更具可读性和清晰性,但性能更差。

我听说过ETL工具和SpringBatch,但我对它们并不了解。 还有其他方法可以解决这个问题吗?

提前致谢。

UPDATE

感谢您提供宝贵的建议。 我选择使用SpringBatch从Oracle数据库加载数据,因为环境非常紧张,我无法访问Oracle的工具集。 SpringBatch是真实的。 对于数据写入步骤,我选择使用MySQL的LOAD DATA INFILE编写大量的记录。 REST服务位于中间,因为出于安全原因它们彼此隐藏。

100M行是相当多的。 您可以通过多种方式进行设计:REST服务器,JDBC读取, Spring Batch , Spring集成 ,Hibernate,ETL。 但最重要的是: 时间

无论您选择哪种架构,最终都必须将这些INSERT执行到MySQL中。 你的里程可能会有所不同,但只是给你一个数量级:每秒2K插入,用100M行( 源 )填充MySQL需要半天时间。

根据相同的来源, LOAD DATA INFILE可以处理大约25K插入/秒(大约多10倍并且大约一小时的工作)。

据说有这么多数据,我建议:

  • 使用生成人类可读内容的原生Oracle数据库工具转储Oracle表(或者计算机可读,但您必须能够解析它)

  • 使用尽可能快的工具解析转储文件。 也许grep / sed / gawk / cut就足够了?

  • 生成与MySQL LOAD DATA INFILE兼容的目标文件(它是非常可配置的)

  • 使用上述命令在MySQL中导入文件

当然,你可以在Java中使用漂亮可读的代码,unit testing和版本化。 但是,有了这么多数据,你需要务实。

这是初始负载。 在那之后,Spring Batch可能是一个不错的选择。 如果可以,尝试将您的应用程序直接连接到两个数据库 – 再次,这将更快。 另一方面,出于安全原因,这可能是不可能的。

如果您想要非常灵活并且不要直接将自己绑定到数据库中,那么将Web输入(Oracle)和输出(MySQL)暴露在Web服务之后(REST也可以)。 Spring集成将为您提供很多帮助。

您可以使用Scriptella在数据库之间传输数据。 以下是XML转换文件的示例:

       SELECT * FROM Src_Table     
    Interesting Posts