我是一名有用的助手,可以为您翻译文本。
执行 System.out.println("doing a batch " + i); 和执行 System.out.println("done batch " + i); 之间的时间大约为30秒,考虑到只向三列表中插入了两列(另一列是自动编号主键,在开始/测试时表中没有行),这似乎有点多余。我唯一能想到的是在调用此方法之前,另一个方法使用查询来检查 tblPostingsShingles 表中是否存在某些 rowIds。然而,我认为当该方法完成时任何锁定都会被释放(它与此方法具有相同的 finally 子句)。任何建议将不胜感激。 戴夫
可能是重复问题:
JDBC批量插入性能
我在一个类中有以下方法:
public void insertShingleSets(Vector<ShingleSet> shingleSets)
{
String sql = "INSERT INTO tblPostingsShingles("+
"rowId, " +
"shingle) " +
"VALUES(?,?);";
PreparedStatement statement = null;
try {
statement = conn.prepareStatement(sql);
for (int i = 0; i < shingleSets.size(); i++)
{ String id = shingleSets.get(i).getRowId();
String shingle = shingleSets.get(i).getShingle();
statement.setInt(1, Integer.parseInt(id));
statement.setString(2, shingle);
statement.addBatch();
if ((i + 1) % 1000 == 0) {
System.out.println("doing a batch " + i); //-------------
statement.executeBatch(); // Execute every 1000 items.
System.out.println("done batch " + i); //-------------
}
}
statement.executeBatch();
}
catch (SQLException ex)
{
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
finally {
if (statement != null)
try { statement.close();
} catch (SQLException logOrIgnore) {}
if (conn != null)
try { conn.close();
} catch (SQLException logOrIgnore) {}
}
}
执行 System.out.println("doing a batch " + i); 和执行 System.out.println("done batch " + i); 之间的时间大约为30秒,考虑到只向三列表中插入了两列(另一列是自动编号主键,在开始/测试时表中没有行),这似乎有点多余。我唯一能想到的是在调用此方法之前,另一个方法使用查询来检查 tblPostingsShingles 表中是否存在某些 rowIds。然而,我认为当该方法完成时任何锁定都会被释放(它与此方法具有相同的 finally 子句)。任何建议将不胜感激。 戴夫