使用PreparedStatement和executeBatch在jdbc上进行最快的'更新'

时间:2010-02-03 17:03:56

标签: java sql-server jdbc

我有一个java程序,在某些情况下必须更新数据库中的大量记录(例如100,000)。

它的方式是创建PreparedStatement并使用addBatch技术。 这是片段:

connection.setAutoCommit(false);
PreparedStatement ps = connection.prepareStatement(
        "UPDATE myTable SET colName=? where id=?");

for (...) { // this loop can be 100000 long 
     colValue = ...
     id = ...
     ps.setString(1,colValue);
     ps.setString(2,id);
     ps.addBatch();
  }

ps.executeBatch();
connection.commit();

这是更新JDBC中100000条记录的最佳(最快)方法吗?

有人能提出更好的建议吗?

4 个答案:

答案 0 :(得分:2)

尝试将此作为基准:

  1. 使用内置SQL工具对整个表进行批量提取。所有行。所有专栏。

  2. 删除(或重命名)表格。

  3. 使用简单的平面文件读/写来创建应用更新的新文件。

  4. 使用数据库附带的批量加载实用程序从提取的文件重建整个表。

  5. 重新加载后添加索引。

  6. 您可能会发现这比任何SQL解决方案都要快。我们停止使用UPDATES用于数据仓库,因为提取 - >平面文件处理 - >加载比SQL快得多。

答案 1 :(得分:0)

由于批处理在客户端使用缓冲,然后将所有内容作为单个请求发送,因此执行5000行的批处理可能是明智的。添加100.000行时应该注意内存消耗。

有时它可以更快地将数据推送到多个负载而不是单个负载(使用JDBC,至少基于我之前的经验)。

答案 2 :(得分:0)

不要使用for循环使用spring jdbc template

答案 3 :(得分:-1)

您应该对JdbcTemplate

使用Spring Batch操作