Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaETL过程_Java_Hibernate_Jdbc_Etl - Fatal编程技术网

JavaETL过程

JavaETL过程,java,hibernate,jdbc,etl,Java,Hibernate,Jdbc,Etl,我面临的新挑战是从Oracle数据库加载约100万行,并将它们插入远程MySQL数据库服务器 我将问题分为两部分: 服务器端REST服务器,负责将数据加载到MySQL服务器中 负责加载Oracle数据源的客户端Java应用程序 在Java端,我使用普通JDBC加载分页内容,并通过网络将其传输到服务器。这种方法工作得很好,但由于我自己使用Oracle的ROWNUM进行分页,因此代码很麻烦,伸缩性也不太好……其中ROWNUM>x和ROWNUM

我面临的新挑战是从Oracle数据库加载约100万行,并将它们插入远程MySQL数据库服务器

我将问题分为两部分:

  • 服务器端REST服务器,负责将数据加载到MySQL服务器中
  • 负责加载Oracle数据源的客户端Java应用程序
  • 在Java端,我使用普通JDBC加载分页内容,并通过网络将其传输到服务器。这种方法工作得很好,但由于我自己使用Oracle的ROWNUM进行分页,因此代码很麻烦,伸缩性也不太好……其中ROWNUM>x和ROWNUM 我现在尝试了Hibernate的无状态会话,通过注释映射实体。代码更具可读性和干净性,但性能更差

    我听说过ETL工具和SpringBatch,但我对它们不太了解。 有没有其他办法解决这个问题

    提前谢谢

    更新

    谢谢你的宝贵建议。 我选择使用SpringBatch从Oracle数据库加载数据,因为环境非常紧张,我无法访问Oracle的工具集。SpringBatch是真实的。
    对于数据写入步骤,我选择使用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中导入文件

    当然,您可以在Java中使用漂亮、可读的代码、经过单元测试和版本控制来实现这一点。但是有了这么多的数据,你需要实事求是

    这就是初始载荷。在那之后,可能春季批次将是一个不错的选择。如果可以,请尝试将应用程序直接连接到这两个数据库-同样,这会更快。另一方面,出于安全原因,这可能是不可能的

    如果您希望非常灵活,并且不想直接绑定到数据库中,那么在web服务后面公开输入(Oracle)和输出(MySQL)(REST也可以)。Spring集成将对您有很大帮助。

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

    <!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本机工具慢一点,但您确实跳过了一步,仍然使用加载数据文件的速度,这可能是更耗时的因素。