我想知道何时从Spring框架的update()
类使用bacthUpdate()
或NamedParameterJdbcTemplate
方法。update()
有任何行限制吗?多少行可以处理update()
而不会出现性能问题或挂起我的数据库?从多少行batchUpdate()
开始获得良好的性能?
谢谢。
最佳答案
贝娄是我的观点:
只要需要一起执行多个sql,就应该使用bacthUpdate()
。
这应取决于您使用的 DB 。但是我还没有达到更新的行数限制。当然,更新几行比更新多行要快(例如UPDATE ... WHERE id=1
与UPDATE ... WHERE id > 1
)。
不能确定。这取决于您使用的 DB ,机器性能等。如果想知道确切的结果,可以查看 DB供应商的基准,也可以通过一些测试进行测量。
实际上,当您批量处理batchUpdate()
,INSERT
或UPDATE
时,通常会使用DELETE
,这将大大提高性能。如:
批量插入:
SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(employees.toArray());
int[] updateCounts = namedParameterJdbcTemplate.batchUpdate("INSERT INTO EMPLOYEE VALUES (:id, :firstName, :lastName, :address)", batch);
return updateCounts;
批处理更新:
List<Object[]> batch = new ArrayList<Object[]>();
for (Actor actor : actors) {
Object[] values = new Object[] {
actor.getFirstName(),
actor.getLastName(),
actor.getId()};
batch.add(values);
}
int[] updateCounts = jdbcTemplate.batchUpdate(
"update t_actor set first_name = ?, last_name = ? where id = ?",
batch);
return updateCounts;
在内部,
batchUpdate()
将使用PreparedStatement.addBatch()
,您可以查看一些spring jdbc tutorial.。将Batch operations
一次发送到数据库,而不是一一发送更新。一次性将一批更新发送到数据库要比逐个发送更新(等待每个更新完成)要快。发送一批更新(仅1次往返)时,所涉及的网络流量较少,并且数据库可以并行执行一些更新。此外,当您使用
batch operation
并且缺省情况下batchUpdate()
不在一个事务中,数据库驱动程序必须支持batchUpdate()
。您可以查看更多详细信息:
https://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html#jdbc-advanced-jdbc
http://tutorials.jenkov.com/jdbc/batchupdate.html#batch-updates-and-transactions
希望您有所帮助。