2014-10-30 146 views
0

仅供参考 - 我不是开发人员,但需要时编写代码:)尝试编写一些Java代码以批处理方式更新数据库以获得多条记录。在插入新行时,我正在查询另一个表以查找相关数据以添加相关日期。具有嵌套选择性能的JDBC MySQL DML语句插入

该代码似乎工作,但我的问题是性能。我看到,完整的一批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(); 

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

+0

referrerUpdateSet来自哪里? – slambeth 2014-10-30 20:00:40

+0

因此,仔细看看问题,似乎addBatch()覆盖了前面的语句。所以,不要追加到语句清单,在批处理结束时,只有一个语句... – Doodereeno66 2014-10-30 20:18:34

+0

严......所以...白痴移动 - 行'stmt = mktoUTMConn.prepareStatement(dmlStatement);'需要移到循环之外:/ noob对细节的注意力不够 – Doodereeno66 2014-10-30 20:28:55

回答

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