NamedParameterJdbcTemplate的update()和batchUpdate()方法之间的性能和限制问题

jal*_*039 5 java spring

我想知道什么时候使用Spring框架的类update()bacthUpdate()方法NamedParameterJdbcTemplate

有行限制update()吗?update()没有性能问题或挂起数据库可以处理多少行?从几行开始batchUpdate()获得良好的性能?

谢谢。

小智 5

以下是我的观点:

\n\n
\n

何时使用 Spring 框架的 NamedParameterJdbcTemplate 类中的 update() 或 bacthUpdate() 方法

\n
\n\n

你应该使用bacthUpdate()当需要同时执行多个sql时,

\n\n
\n

update() 有行数限制吗?

\n
\n\n

这应该取决于您使用的数据库。但我还没有达到更新的行限制。当然\xef\xbc\x8更新几行比更新很多行要快。(例如,UPDATE ... WHERE id=1vsUPDATE ... WHERE id > 1)。

\n\n
\n

有多少行可以处理 update() 而不会出现性能问题或挂起我的数据库?

\n
\n\n

这个还不确定。这取决于您使用的DB机器性能等。如果您想知道确切的结果,可以查看DB Vendor's Benchmark,或者你可以通过一些测试来衡量它。

\n\n
\n

从多少行开始,batchUpdate() 可以获得良好的性能?

\n
\n\n

事实上,batchUpdate()在执行批处理时常用INSERTUPDATE或者DELETE,这会提高很多性能。例如:

\n\n

批量插入

\n\n
SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(employees.toArray());\nint[] updateCounts = namedParameterJdbcTemplate.batchUpdate("INSERT INTO EMPLOYEE VALUES (:id, :firstName, :lastName, :address)", batch);\nreturn updateCounts;\n
Run Code Online (Sandbox Code Playgroud)\n\n

批量更新

\n\n
List<Object[]> batch = new ArrayList<Object[]>();\n    for (Actor actor : actors) {\n        Object[] values = new Object[] {\n                actor.getFirstName(),\n                actor.getLastName(),\n                actor.getId()};\n        batch.add(values);\n    }\n    int[] updateCounts = jdbcTemplate.batchUpdate(\n            "update t_actor set first_name = ?, last_name = ? where id = ?",\n            batch);\n    return updateCounts;\n
Run Code Online (Sandbox Code Playgroud)\n\n

内部batchUpdate()会使用PreparedStatement.addBatch(),可以查看一些spring jdbc教程。Batch operations一次性发送到数据库,而不是逐一发送更新。\n一次性向数据库发送一批更新,比逐一发送、等待每个更新完成要快。发送一批更新涉及的网络流量较少(仅 1 次往返),并且数据库可能能够并行执行某些更新。此外,batch operation您使用batchUpdate()batchUpdate()在一个事务中的情况。

\n\n

更多详情您可以查看:

\n\n

https://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html#jdbc-advanced-jdbc \n http://tutorials.jenkov.com/jdbc/batchupdate.html #批量更新和交易

\n\n

希望你一定要帮忙。

\n