【问题标题】:JDBC MySQL DML Statement Insert with Nested Select Performance具有嵌套选择性能的 JDBC MySQL DML 语句插入
【发布时间】:2014-12-27 00:38:35
【问题描述】:

仅供参考 - 我不是开发人员,但在必要时编写代码 :) 尝试编写一些 java 代码以批量方式更新数据库以获取多条记录。当我插入新行时,我正在查询另一个表以查找相关数据以添加相关日期。

代码似乎可以工作,但我的问题是性能。我看到整批 dml 语句每条语句执行大约需要 1 秒。我正在更新数千条记录,所以这项工作需要相当长的时间才能执行。所以,我正在寻找的是关于如何在最大化性能的同时做到这一点的任何其他想法。

这就是我现在正在做的事情。

for(Referrer_UpdateSet i : referrerUpdateSet)
        {


            String dmlStatement = "INSERT INTO TempRefURL (firstTouchDate) " +
            "(SELECT activityDateTime as firstTouch "+ 
            "FROM referrer_URL_backup_10292014 "+ 
            "WHERE mktPersonId = ? "+ 
            "ORDER BY activityDateTime ASC LIMIT 1)";
            stmt = mktoUTMConn.prepareStatement(dmlStatement);
            stmt.setInt(1, i.id);
            //System.out.println(stmt+" \n");
            stmt.executeUpdate();
        }
        mktoUTMConn.commit();

我也在尝试preparedStatements.addBatch,但它似乎不起作用(只插入了1行..)

        System.out.println("updating temp table with referrer URL data");
        //iterate through array of parsed referrer URLs

        String dmlStatement = "UPDATE dml_sandbox.TempRefURL SET Referrer_URL = ? " + "WHERE id = ?";
        for(Referrer_UpdateSet i : referrerUpdateSet){




            stmt = mktoUTMConn.prepareStatement(dmlStatement);
            stmt.setInt(2, i.id);
            stmt.setString(1, i.cleanURL);
            //System.out.println(stmt+" \n");
            stmt.addBatch();
            //stmt.executeUpdate();


            //System.out.println(stmt+" \n");
        }   
        stmt.executeBatch();
        System.out.println("Done updating temp table with referrer URL data");
        mktoUTMConn.commit();

任何建议将不胜感激。谢谢!

【问题讨论】:

  • referrerUpdateSet 来自哪里?
  • 所以,仔细看看问题,似乎 addBatch() 正在覆盖前面的语句。所以,不是追加到语句列表中,而是在批处理结束时,只有一个语句......
  • 嗯...所以...白痴移动-行'stmt = mktoUTMConn.prepareStatement(dmlStatement);'需要被移到循环之外:/对细节不太关注的菜鸟......

标签: java mysql jdbc prepared-statement


【解决方案1】:

简单的修复。请参阅我上面的评论。这是新代码:

String dmlStatement = "UPDATE dml_sandbox.TempRefURL SET Referrer_URL = ? " + "WHERE id = ?";
        stmt = mktoUTMConn.prepareStatement(dmlStatement);
        //iterate through array of parsed referrer URLs
        for(Referrer_UpdateSet i : referrerUpdateSet){

            stmt.setInt(2, i.id);
            stmt.setString(1, i.cleanURL);
            stmt.addBatch();
            stmt.executeUpdate();

        }   
        System.out.println(stmt+" \n");
        int[] recordsAffected = stmt.executeBatch();
        System.out.println("Done updating temp table with referrer URL data");
        System.out.println(recordsAffected.length +  " records affected");
        mktoUTMConn.commit();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多