具有嵌套选择性能的JDBC MySQL DML语句插入

时间:2014-10-30 19:49:46

标签: java mysql jdbc prepared-statement

仅供参考 - 我不是开发人员,但在必须时编写代码:)尝试编写一些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,但它似乎没有工作(只插入了一行..)

        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();

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

1 个答案:

答案 0 :(得分:0)

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

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();