2012-07-11 88 views
2

我有一个Java程序连接到SQL Server 2008数据库并执行修改。如果我有一百万条记录,我想修改,是不好的做法,操作如下:与Java的多个SQL查询(效率)

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知识很基础。

回答

1

对于大量的更新,最好使用Statement.executeBatch()

尝试谷歌为“java executebatch示例”为例。

您很可能还希望确保正确使用事务,查询的大量开销来自隐式事务(每个查询一个事务),其中对于多个语句使用单个事务可以更有效。

+0

好的,谢谢,正是我需要的。所以,如果我正在做多个SELECT,executeBatch不会帮助我(?),那么在这种情况下我将如何正确使用事务? – chris 2012-07-11 16:45:25

+0

@xcross你在编码之前显然需要数据库和SQL方面的一些知识。你有一位可以帮助你挖掘SQL World的DB Master吗?或者尝试在Google上查找教程。 – Tusc 2012-07-11 17:24:49

+0

@Tusc那么有用...... – chris 2012-07-11 17:35:30

2

如果查询您的所有迭代一样的,迭代之前创建PreparedStatement,并在反复调用结束PreparedStatemetn.executeBatch()Jesse Webb建议。

我建议在几次迭代之后(可能在每次1000次迭代之后)提交您的事务,因为当更新或删除记录而未提交事务时,锁定变更记录会对其他用户造成问题(如果你不是这些数据库对象的唯一客户端!)。

+0

+1用于建议对事务进行批量提交。对于我所处理的批处理作业,我们决定使用批次数为100的锁,以获得最大的性能增益。你将不得不尝试找出最适合你的东西。 – 2012-07-11 19:06:37