1

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

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

4

3 回答 3

2

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

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

使用这种技术,您可以有效地处理大量输入。

于 2012-12-11T20:13:23.373 回答
2

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

另一方面,如果您尝试使用 1,000,000 行来执行此操作,则很可能会遇到麻烦,因此您应该以 1000 个事务的数据包的形式进行,每个事务具有 1000 行。

如果由于某种原因,事务中的 1000 行太多,则以数据包的形式进行,比如说 200、100 或 50。

于 2012-12-11T20:13:43.433 回答
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()

于 2012-12-11T20:16:02.103 回答