2009-08-17 80 views
2

我有一段代码在数据库上执行大约500,000次插入。它现在在一个循环中完成,每次迭代都会调用PreparedStatement的executeUpdate。将所有500,000个插入添加到一个批次并且只调用一次executeBatch会更快吗?何时更快地在JDBC上使用批处理操作?

+1

“更好”是什么意思?更简单?更快?更容易维护?较少使用网络?发生问题时容易回滚? – 2009-08-17 18:06:51

+1

@ S.Lott:假设“更好”意味着在关于SQL的99%问题中“更快”,这是非常安全的。 – 2009-08-17 18:22:04

+0

@ Bill Karwin:有趣的观察。你怎么知道?这个问题真的吗?你怎么知道*? – 2009-08-17 18:32:47

回答

3

是的,它会更快。请确保先关闭autoCommit,否则您将无法获得性能优势。

4

与(从Sun JDBC doc)批量更新设备产量最有效的结果结合使用PreparedStatement的:

// turn off autocommit 
con.setAutoCommit(false); 

PreparedStatement stmt = con.prepareStatement(
    "INSERT INTO employees VALUES (?, ?)"); 

stmt.setInt(1, 2000); 
stmt.setString(2, "Kelly Kaufmann"); 
stmt.addBatch(); 

stmt.setInt(1, 3000); 
stmt.setString(2, "Bill Barnes"); 
stmt.addBatch(); 

// submit the batch for execution 
int[] updateCounts = stmt.executeBatch(); 
1

500.000是太多,一次加入。记住这些记录保存在内存中并立即发送。将它们分批加入数千个,我没有注意到批量(使用MySQL)的1000行和10000行之间有任何改进,但我认为其他一些因素很重要。

+0

对于准备好的语句的小例子来说,它可能是非常可行的。但它真的取决于,我同意... – topchef 2009-08-17 23:19:25