Java ETL过程

Jor*_*lva 0 java etl hibernate jdbc

我有一个新的挑战是从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服务位于中间,因为出于安全原因它们彼此隐藏.

Tom*_*icz 5

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

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

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

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

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

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

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

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

当然,你可以用Java编写好的代码,经过单元测试和版本控制.但是,有了这么多数据,你需要务实.

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

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