我要从Oracle数据库加载约1亿行并将其插入远程MySQL数据库服务器中,这是一个新挑战。
我将问题分为两部分:
在Java方面,我使用了普通的JDBC来加载分页内容并将其通过导线传输到服务器。这种方法效果很好,但是由于我自己使用Oracle的ROWNUM ..... WHERE ROWNUM> x和ROWNUM <y进行分页,因此代码繁琐且伸缩性不高。
现在,我尝试了通过注释映射我的实体的Hibernate的StatelessSession。该代码更具可读性和简洁性,但性能却更差。
我听说过ETL工具和SpringBatch,但是我不太了解它们。还有其他解决此问题的方法吗?
提前致谢。
更新
感谢您的宝贵建议。我选择使用 SpringBatch 从Oracle数据库加载数据,因为环境非常紧凑,而且我无法使用Oracle的工具集。SpringBatch是真实的。对于数据写入步骤,我选择使用大家都说过的MySQL的LOAD DATA INFILE写入记录块。REST服务位于中间,因为出于安全原因它们彼此隐藏。
1亿行相当多。您可以通过多种方式进行设计:REST服务器,JDBC读取,Spring Batch,Spring集成,Hibernate,ETL。但最重要的是: time 。
无论选择哪种架构,最终都必须在INSERTMySQL中执行这些操作。您的里程可能会有所不同,但仅是一个数量级:每秒插入2K次插入MySQL,将需要半天的时间来填充100M行(源)。
INSERT
根据同一资料来源,LOAD DATA INFILE每秒可处理约25K次插入(大约多10倍,大约需要一个小时的工作时间)。
LOAD DATA INFILE
话虽这么多,我建议:
使用可产生人类可读内容(或计算机可读内容,但您必须能够解析它)的本地Oracle数据库工具转储Oracle表
尽可能快地分析转储文件。也许grep/ sed/ gawk/ cut就足够了?
grep
sed
gawk
cut
生成与MySQL兼容的目标文件LOAD DATA INFILE(它是可配置的)
使用上述命令在MySQL中导入文件
当然,您可以使用美观且可读的代码,经过单元测试和版本控制的Java语言来执行此操作。但是,有了如此大量的数据,您就必须要务实。
那是初始负载。在那之后,Spring Batch将是一个不错的选择。如果可以的话,请尝试将您的应用程序直接连接到两个数据库,这又会更快。另一方面,出于安全原因,这可能是不可能的。
如果您想变得非常灵活并且不直接将自己绑定到数据库中,请在Web服务后面公开输入(Oracle)和输出(MySQL)(REST也可以)。Spring集成将为您带来很大帮助。