我有一个包含大约 1000 行的文件。我试图实现的功能是获取这个文件,验证它,一旦它被验证,我必须将这些行插入到数据库表中:)
我的问题是:在 for 循环中进行插入是否会造成主要的性能问题?这个 for 循环将在文件的每一行上调用 insert。所以我们谈论的是通过 for 循环完成的 1000 个 INSERT。实现这样的事情的最佳方法是什么?我在做一些明显错误的事情吗?
您可以批量处理所有这些插入。当你阅读你的文件时,你构建你的插入,然后像这样执行它们:
Statement st = con.createStatement();
st.addBatch("INSERT INTO xx VALUES(...)");
st.addBatch("INSERT INTO xx VALUES(...)")
st.executeBatch();
使用这种技术,您可以有效地处理大量输入。
这通常应该没有问题。开始一个事务,每次插入每一行并关闭事务。这就对了。1000行应该没问题。
另一方面,如果您尝试使用 1,000,000 行来执行此操作,则很可能会遇到麻烦,因此您应该以 1000 个事务的数据包的形式进行,每个事务具有 1000 行。
如果由于某种原因,事务中的 1000 行太多,则以数据包的形式进行,比如说 200、100 或 50。
基本上在循环中执行 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()