Java 将数百万行从teradata传输到mySQL

Java 将数百万行从teradata传输到mySQL,java,mysql,sql,bigdata,teradata,Java,Mysql,Sql,Bigdata,Teradata,我必须将大约500万行数据从Teradata传输到MySQL。任何人都可以建议我最快的方式通过网络来做这件事,而不使用文件系统。我不熟悉Teradata和MySQL。我想每周以批处理作业的形式运行此传输,因此我正在寻找可以完全自动化的解决方案。如有任何建议或提示,将不胜感激 我已经编写了使用JDBC从Teradata获取记录并将其插入MySQL的代码。但是它非常慢,所以我希望使代码更高效。我之所以使用泛型,是因为我没有受实现约束的解决方案,因为除了提高现有代码的效率外,我还愿意接受其他替代方案。

我必须将大约500万行数据从Teradata传输到MySQL。任何人都可以建议我最快的方式通过网络来做这件事,而不使用文件系统。我不熟悉Teradata和MySQL。我想每周以批处理作业的形式运行此传输,因此我正在寻找可以完全自动化的解决方案。如有任何建议或提示,将不胜感激

我已经编写了使用JDBC从Teradata获取记录并将其插入MySQL的代码。但是它非常慢,所以我希望使代码更高效。我之所以使用泛型,是因为我没有受实现约束的解决方案,因为除了提高现有代码的效率外,我还愿意接受其他替代方案。但是我不想使用文件系统,因为维护或更新脚本并不容易

我的实施:

从teradata获取记录:

connection  =   DBConnectionFactory.getDBConnection(SOURCE_DB);

    statement = connection.createStatement();
    rs = statement.executeQuery(QUERY_SELECT);
    while (rs.next()) {

        Offer offer = new Offer();
        offer.setExternalSourceId(rs.getString("EXT_SOURCE_ID"));
        offer.setClientOfferId(rs.getString("CLIENT_OFFER_ID"));
        offer.setUpcId(rs.getString("UPC_ID"));

        offers.add(offer);
    }
int count = 0;
    if (isUpdated) {
        for (Offer offer : offers) {

            count++;

            stringBuilderUpdate = new StringBuilder();
            stringBuilderUpdate = stringBuilderUpdate
                    .append(QUERY_INSERT);

            stringBuilderUpdate = stringBuilderUpdate.append("'"
                    + offer.getExternalSourceId() + "'");

            statement.addBatch(stringBuilderUpdate.toString());

            queryBuilder = queryBuilder.append(stringBuilderUpdate
                    .toString() + SEMI_COLON);

            if (count > LIMIT) {
                countUpdate = statement.executeBatch();
                LOG.info("DB update count : " + countUpdate.length);
                count = 0;
            }

        }
        if (count > 0) {
            // Execute batch
            countUpdate = statement.executeBatch();
        }
在mySQL中插入记录:

connection  =   DBConnectionFactory.getDBConnection(SOURCE_DB);

    statement = connection.createStatement();
    rs = statement.executeQuery(QUERY_SELECT);
    while (rs.next()) {

        Offer offer = new Offer();
        offer.setExternalSourceId(rs.getString("EXT_SOURCE_ID"));
        offer.setClientOfferId(rs.getString("CLIENT_OFFER_ID"));
        offer.setUpcId(rs.getString("UPC_ID"));

        offers.add(offer);
    }
int count = 0;
    if (isUpdated) {
        for (Offer offer : offers) {

            count++;

            stringBuilderUpdate = new StringBuilder();
            stringBuilderUpdate = stringBuilderUpdate
                    .append(QUERY_INSERT);

            stringBuilderUpdate = stringBuilderUpdate.append("'"
                    + offer.getExternalSourceId() + "'");

            statement.addBatch(stringBuilderUpdate.toString());

            queryBuilder = queryBuilder.append(stringBuilderUpdate
                    .toString() + SEMI_COLON);

            if (count > LIMIT) {
                countUpdate = statement.executeBatch();
                LOG.info("DB update count : " + countUpdate.length);
                count = 0;
            }

        }
        if (count > 0) {
            // Execute batch
            countUpdate = statement.executeBatch();
        }
有谁能告诉我,我们是否能使这个代码更有效

谢谢

PS:请忽略上面代码中的语法错误,因为这段代码工作正常。由于复制和粘贴,可能会丢失一些信息。

将数据导入MySQL的方法是使用or,这是加载数据填充的命令行界面,它涉及从文件加载数据,最好位于本地文件系统上

从文本文件加载表格时,请使用“加载数据填充”。这是 通常比使用INSERT语句快20倍

因此,尽管您不想使用文件系统,但我建议考虑向文件创建转储,将其转储到MySQL服务器上,并使用上面提到的方法加载数据。


所有这些任务都可以通过脚本实现完全自动化。

此外,在向表中添加大量数据时,删除所有索引的速度更快。执行大容量插入,然后重新创建索引。如果插入的数据占总数据的50%以上,这种情况可能更为真实。您最终是如何完成此任务的?