我想知道何时从Spring框架的update()类使用bacthUpdate()NamedParameterJdbcTemplate方法。
update()有任何行限制吗?多少行可以处理update()而不会出现性能问题或挂起我的数据库?从多少行batchUpdate()开始获得良好的性能?

谢谢。

最佳答案

贝娄是我的观点:



只要需要一起执行多个sql,就应该使用bacthUpdate()



这应取决于您使用的 DB 。但是我还没有达到更新的行数限制。当然,更新几行比更新多行要快(例如UPDATE ... WHERE id=1UPDATE ... WHERE id > 1)。



不能确定。这取决于您使用的 DB 机器性能等。如果想知道确切的结果,可以查看 DB供应商的基准,也可以通过一些测试进行测量。



实际上,当您批量处理batchUpdate()INSERTUPDATE时,通常会使用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

希望您有所帮助。

09-11 18:12