使用循环通过JDBC在SQL表中插入1000行 - 性能

时间:2012-12-11 20:10:41

标签: java sql jdbc

我有一个包含大约1000行的文件。 我试图实现的功能是获取此文件,验证它,一旦验证,我必须将行插入数据库表:)

我的问题是:在for循环中插入是否会造成严重的性能问题? 这个for循环将在文件的每一行上调用insert。 所以我们讨论的是通过for循环完成的1000个INSERT。 实现这样的事情最好的方法是什么? 我做的事情显然是错的吗?

3 个答案:

答案 0 :(得分:2)

您可以批量处理所有这些插入内容。 当您阅读文件时,您构建插入,然后执行它们:

Statement st = con.createStatement();
st.addBatch("INSERT INTO xx VALUES(...)");
st.addBatch("INSERT INTO xx VALUES(...)")
st.executeBatch();

通过这种技术,您可以有效地处理大量投入。

答案 1 :(得分:2)

这通常应该没问题。启动一个事务,插入每一行并关闭事务。这就对了。 1000行应该没问题。

另一方面,如果你试图用1,000,000行来做这件事,你可能会遇到麻烦,所以你应该做1000个交易的包,每个1000行。

如果由于某种原因,交易中的1000行太多,请以200,100或50的数据包进行处理。

答案 2 :(得分:2)

基本上,在循环中执行1000次插入没有任何问题。对于1000行,它可能不会产生很大的不同,但如果你真的想要获得最佳性能,你应该使用PreparedStatement批量插入:

PreparedStatement  pstmt = con.prepareStatement("insert into the_table (col1, col2) values (?,?)");
for (row=0; row < rowCount; row ++) {
  // obtain the values for each row
  pstmt.setInt(1, some_value);
  pstmt.setString(2, other_value);
  pstmt.addBatch();
}
pstmt.executeBatch();
con.commit();

如果您期望更多行,您可能希望每1000行左右调用一次executeBatch(),因为所有数据(通过addBatch()设置)都会保留在内存中,直到您调用executeBatch()