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的大小?的主要内容,如果未能解决你的问题,请参考以下文章

jdbcTemplate 后台接口中的分页

Spring JdbcTemplate查询实例

将不同类型的参数传递给 jdbctemplate 查询

Spring Boot 和 JDBCTemplate简介: JDBC Template

jdbcTemplate 查询仅使用 SELECT * 执行

springJDBC的几种方法