我有一个包含大约1000行的文件。 我试图实现的功能是获取此文件,验证它,一旦验证,我必须将行插入数据库表:)
我的问题是:在for循环中插入是否会造成严重的性能问题? 这个for循环将在文件的每一行上调用insert。 所以我们讨论的是通过for循环完成的1000个INSERT。 实现这样的事情最好的方法是什么? 我做的事情显然是错的吗?
答案 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()