我有一个连接到SQL Server 2008数据库并执行修改的Java程序。如果我想要修改一百万条记录,那么按照以下方式执行是不好的做法:
for(all of the records I need to modify) {
PreparedStatement pst = conn.prepareStatement(someQuery);
// set record specific parameters for pst
// execute pst
}
或者我应该构建一个查询并执行它?它会有所作为吗?它取决于它是UPDATE,INSERT还是DELETE?我的SQL知识非常基础。
答案 0 :(得分:2)
如果所有迭代的查询都相同,请在迭代前创建PreparedStatement
,并在迭代结束时调用PreparedStatemetn.executeBatch()
建议为Jesse Webb
。
我建议在几次迭代之后提交您的事务(可能在每1000次迭代之后),因为在不提交事务的情况下更新或删除记录时,将会对变更记录进行锁定,这会导致其他用户的问题。数据库(如果您不是这些数据库对象的唯一客户端!)。
答案 1 :(得分:1)
对于大量UPDATE,最好使用Statement.executeBatch()
。
尝试使用Google的“java executebatch示例”作为示例。
您很可能还希望确保正确使用事务,查询的大量开销来自隐式事务(每个查询一个),其中对许多语句使用单个事务可以更有效。