一尘不染

Java ETL流程

hibernate

我要从Oracle数据库加载约1亿行并将其插入远程MySQL数据库服务器中,这是一个新挑战。

我将问题分为两部分:

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

在Java方面,我使用了普通的JDBC来加载分页内容并将其通过导线传输到服务器。这种方法效果很好,但是由于我自己使用Oracle的ROWNUM .....
WHERE ROWNUM> x和ROWNUM <y进行分页,因此代码繁琐且伸缩性不高。

现在,我尝试了通过注释映射我的实体的Hibernate的StatelessSession。该代码更具可读性和简洁性,但性能却更差。

我听说过ETL工具和SpringBatch,但是我不太了解它们。还有其他解决此问题的方法吗?

提前致谢。

更新

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


阅读 763

收藏
2020-06-20

共1个答案

一尘不染

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

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

根据同一资料来源,LOAD DATA INFILE每秒可处理约25K次插入(大约多10倍,大约需要一个小时的工作时间)。

话虽这么多,我建议:

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

  • 尽可能快地分析转储文件。也许grep/ sed/ gawk/ cut就足够了?

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

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

当然,您可以使用美观且可读的代码,经过单元测试和版本控制的Java语言来执行此操作。但是,有了如此大量的数据,您就必须要务实。

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

如果您想变得非常灵活并且不直接将自己绑定到数据库中,请在Web服务后面公开输入(Oracle)和输出(MySQL)(REST也可以)。Spring集成将为您带来很大帮助。

2020-06-20