Java 具有嵌套Select性能的JDBC MySQL DML语句插入
仅供参考-我不是开发人员,但在必要时编写代码:)尝试编写一些java代码,以批量方式更新多条记录的数据库。在插入新行时,我查询另一个表以查找相关数据以添加相关日期 代码似乎有效,但我的问题是性能。我发现完整的一批dml语句执行每个语句大约需要1秒的时间。我正在更新几千条记录,所以这项工作需要很长时间才能执行。所以,我要寻找的是关于如何在实现性能最大化的同时做到这一点的任何其他想法 这就是我现在正在做的Java 具有嵌套Select性能的JDBC MySQL DML语句插入,java,mysql,jdbc,prepared-statement,Java,Mysql,Jdbc,Prepared Statement,仅供参考-我不是开发人员,但在必要时编写代码:)尝试编写一些java代码,以批量方式更新多条记录的数据库。在插入新行时,我查询另一个表以查找相关数据以添加相关日期 代码似乎有效,但我的问题是性能。我发现完整的一批dml语句执行每个语句大约需要1秒的时间。我正在更新几千条记录,所以这项工作需要很长时间才能执行。所以,我要寻找的是关于如何在实现性能最大化的同时做到这一点的任何其他想法 这就是我现在正在做的 for(Referrer_UpdateSet i : referrerUpdateSet)
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行..)
如有任何建议,将不胜感激。谢谢 简单修复。见我上面的评论。以下是新代码:
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();
refererUpdateSet从何而来?因此,仔细看看这个问题,addBatch()似乎正在覆盖前面的语句。因此,在批处理的末尾,没有附加到语句列表,而是只有一个语句…嗯。。。所以白痴移动-行'stmt=mktoUTMConn.prepareStatement(dmlStatement);'需要移动到循环之外:/noob对细节关注不够。。。
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();