我有一个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条记录的最佳(最快)方法吗?
有人能提出更好的建议吗?
答案 0 :(得分:2)
尝试将此作为基准:
使用内置SQL工具对整个表进行批量提取。所有行。所有专栏。
删除(或重命名)表格。
使用简单的平面文件读/写来创建应用更新的新文件。
使用数据库附带的批量加载实用程序从提取的文件重建整个表。
重新加载后添加索引。
您可能会发现这比任何SQL解决方案都要快。我们停止使用UPDATES用于数据仓库,因为提取 - >平面文件处理 - >加载比SQL快得多。
答案 1 :(得分:0)
由于批处理在客户端使用缓冲,然后将所有内容作为单个请求发送,因此执行5000行的批处理可能是明智的。添加100.000行时应该注意内存消耗。
有时它可以更快地将数据推送到多个负载而不是单个负载(使用JDBC,至少基于我之前的经验)。
答案 2 :(得分:0)
不要使用for循环使用spring jdbc template
答案 3 :(得分:-1)
您应该对JdbcTemplate
使用Spring Batch操作