JavaETL过程
我面临的新挑战是从Oracle数据库加载约100万行,并将它们插入远程MySQL数据库服务器 我将问题分为两部分:JavaETL过程,java,hibernate,jdbc,etl,Java,Hibernate,Jdbc,Etl,我面临的新挑战是从Oracle数据库加载约100万行,并将它们插入远程MySQL数据库服务器 我将问题分为两部分: 服务器端REST服务器,负责将数据加载到MySQL服务器中 负责加载Oracle数据源的客户端Java应用程序 在Java端,我使用普通JDBC加载分页内容,并通过网络将其传输到服务器。这种方法工作得很好,但由于我自己使用Oracle的ROWNUM进行分页,因此代码很麻烦,伸缩性也不太好……其中ROWNUM>x和ROWNUM
对于数据写入步骤,我选择使用MySQL的LOAD data INFILE写入记录块,正如大家所说的。由于安全原因,REST服务处于中间状态,
100m行相当多。您可以通过多种方式进行设计:REST服务器、JDBC读取、Hibernate、ETL。但底线是:时间
无论您选择什么架构,最终都必须在MySQL中执行这些INSERT
s。您的里程数可能会有所不同,但这只是为了给您一个数量级:每秒插入2K次,需要半天的时间才能用100M行填充MySQL()
根据同一来源,每秒可以处理大约25K个插入(大约多10倍,大约一个小时的工作)
尽管有这么多的数据,我还是建议:
- 使用本机Oracle数据库工具转储Oracle表,该工具可生成人类可读的内容(或计算机可读的内容,但必须能够对其进行解析)
- 使用尽可能快的工具解析转储文件。也许
/grep
/sed
/gawk
就足够了cut
- 生成与MySQL兼容的目标文件加载数据填充(非常可配置)
- 使用上述命令在MySQL中导入文件
<!DOCTYPE etl SYSTEM "http://scriptella.javaforge.com/dtd/etl.dtd">
<etl>
<connection id="in" url="jdbc:oracle:thin:@localhost:1521:ORCL"
classpath="ojdbc14.jar" user="scott" password="tiger"/>
<connection id="out" url="jdbc:mysql://localhost:3306/fromdb"
classpath="mysql-connector.jar" user="user" password="password"/>
<!-- Copy all table rows from one to another database -->
<query connection-id="in">
SELECT * FROM Src_Table
<!-- For each row executes insert -->
<script connection-id="out">
INSERT INTO Dest_Table(ID, Name) VALUES (?id,?name)
</script>
</query>
</etl>
从Src_表中选择*
在Dest_表(ID,Name)中插入值(?ID,Name)
只需使用spring批处理。不要为了解决工作而发明东西。如果SSI周围有SQL Server框,也可以很好地完成这项工作。或者,使用JDBC从Oracle检索记录,并将其格式化为“加载数据填充”写入文件或文件序列。可能比使用oracle本机工具慢一点,但您确实跳过了一步,仍然使用加载数据文件的速度,这可能是更耗时的因素。