JdbcTemplate的几个batchUpdate方法,怎样设置 batchSize的大小?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JdbcTemplate的几个batchUpdate方法,怎样设置 batchSize的大小?相关的知识,希望对你有一定的参考价值。
看源码发现,batchSize的大小就是一次性传入的数据量大小,如果一次传入的数据太多,可能会出问题,不能设置batchSize的大小吗?
不知道是不是想要这样的效果To produce result similar to Hibernate (with prepared statment), you should use JdbcTemplate.batchUpdate(String, BatchPreparedStatementSetter). Something like this:final List<Car> cars = Arrays.asList(...);
getJdbcTemplate().batchUpdate("insert into Car (name, id) values (?, ?);",
new BatchPreparedStatementSetter()
private int i =0;
public int getBatchSize()return cars.size();
public void setValues(PreparedStatement ps)
ps.setString(1, cars.get(i).getName());
ps.setInt(2, cars.get(i).getId());
i++;
); 参考技术A 典型的山炮楼主,自己解决了问题,也不公布,有没有想过后来人的感受
何时使用 ParameterizedPreparedStatementSetter 而不是 BatchPreparedStatementSetter,反之亦然,使用 Spring batchUpdat
【中文标题】何时使用 ParameterizedPreparedStatementSetter 而不是 BatchPreparedStatementSetter,反之亦然,使用 Spring batchUpdate?【英文标题】:when to use ParameterizedPreparedStatementSetter over BatchPreparedStatementSetter viceversa, using Spring batchUpdate? 【发布时间】:2019-06-12 19:44:31 【问题描述】:我现在对在 jdbcTemplate.batchupdate 下使用 BatchPreparedStatementSetter 和 ParameterizedPreparedStatementSetter 使用春季批量更新感到困惑。
我浏览过各种博客,甚至是 spring 文档,但无法掌握其背后的概念。
在其中一篇博客 (Spring JDBC performing batch update example) 中,他们说:
ParameterizedPreparedStatementSetter:使用这个,JdbcTemplate 可以 根据传入的批处理大小执行多个批处理 批量更新方法。
BatchPreparedStatementSetter:使用这个,JdbcTemplate 将只运行 根据返回的批处理大小执行单个批处理 实现这个接口。
我想知道我是否想将数据插入 SQL Server DB。在幕后使用每个语句会有什么不同。他们会发送数据库调用吗
MULTIPLE INSERT CALLS BUT PREPARING STATEMENT ONCE
INSERT INTO TABLE VALUES(1,2,3)
INSERT INTO TABLE VALUES(2,3,5)
或
SINGLE INSERT WITH MULTIPLE VALUES AND PREPARING STATEMENT ONCE"
INSERT INTO TABLE VALUES(1,2,3),(2,3,5)
顺便说一句,我使用的是低于 sqljdbc 的版本
<dependency>
<groupId>microsoft</groupId>
<artifactId>sqljdbc</artifactId>
<version>4</version>
</dependency>
和 Spring 版本:4.2.3.RELEASE
【问题讨论】:
【参考方案1】:BatchPreparedStatementSetter 和 ParameterizedPreparedStatementSetter 是 spring 提供的两个预付语句。 BatchPreparedStatementSetter 将一次执行整个批处理,即如果我们有 100 条记录,BatchPreparedStatementSetter 将一次插入所有记录。如果底层数据库没有,那么这可能是一个问题,比如一次有 50 条语句。 这就是为什么它具有一维数组的返回类型。
@Override
public int[] batchInsertAll(List<User> users)
return jdbcTemplate.batchUpdate(SQL_INSERT_USER, new BatchPreparedStatementSetter()
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException
ps.setString(1, users.get(i).getFirstName());
ps.setString(2, users.get(i).getLastName());
@Override
public int getBatchSize()
return users.size();
);
如果我们想将整个批次插入到批次中,那么将使用 BatchPreparedStatementSetter。使用 BatchPreparedStatementSetter 我们可以批量执行。 这就是为什么它具有二维数组的返回类型。下面的代码将一批 users.size 语句执行成 5 批。
@Override
public int[][] batchInsertAll(List<User> users)
return jdbcTemplate.batchUpdate(SQL_INSERT_USER, users, 5, new ParameterizedPreparedStatementSetter<User>()
@Override
public void setValues(PreparedStatement ps, User user) throws SQLException
ps.setString(1, user.getFirstName());
ps.setString(2, user.getLastName());
);
希望这能回答你的问题。
【讨论】:
以上是关于JdbcTemplate的几个batchUpdate方法,怎样设置 batchSize的大小?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 和 JDBCTemplate简介: JDBC Template