jdbcTemplate BatchUpdate 逐行发送,而不是更大的批处理

jdbcTemplate BatchUpdate sending row by row instead of bigger batch

提问人:robber 提问时间:9/27/2023 更新时间:9/27/2023 访问量:67

问:

Spring JdbcTemplate 正在发送 1-3 的小批量大小。我想要 10,000 个批量大小。我用于调用 batchUpdate 的代码如下,以及我在 AWS 的 postgres 数据库上看到的日志。

我在jdbc连接上将rewriteBatchedStatements设置为true。我还尝试将我的函数重写为最后一个代码空间中的代码。

我的目标是在数据库中插入 10,000 条记录,如下所示。

INSERT INTO table_name (column_list)
VALUES
    (value_list_1),
    (value_list_2),
    ...
    (value_list_n);
    public void insertTest(UUID var1, int var2, List<Shape> Tests)
    {
        jdbcTemplate.batchUpdate(
                "INSERT INTO database.table VALUES (?, ?, ?, ?, ?, ?, ?)",
                Tests,
                10000,
                (ps, entity) ->
                {
                    ps.setObject(1, var1);
                    ps.setLong(2, var2);
                    ps.setObject(3, entity.getVar3());
                    ps.setObject(4, entity.getVar4());
                    ps.setObject(5, entity.getVar5());
                    ps.setObject(6, entity.getVar6());
                    ps.setObject(7, entity.getVar7());
                });
    }
2023-09-26T12:47:13.000+13:00   2023-09-25 23:47:13 UTC:10.20.0.125(28120):database:[4882]:LOG: duration: 0.003 ms bind S_1: INSERT INTO database.table VALUES ($1, $2, $3, $4, $5, $6)

2023-09-26T12:47:13.000+13:00   2023-09-25 23:47:13 UTC:10.20.0.125(28120):database:[4882]:DETAIL: parameters: $1 = 'data', $2 = '1', $3 = 'data', $4 = '1', $5 = 'data', $6 = 'data'

2023-09-26T12:47:13.000+13:00   2023-09-25 23:47:13 UTC:10.20.0.125(28120):database:[4882]:LOG: execute S_1: INSERT INTO database.table  VALUES ($1, $2, $3, $4, $5, $6)
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;

    public int[] batchInsert(List<Book> books) {

        return this.jdbcTemplate.batchUpdate(
            "insert into books (name, price) values(?,?)",
            new BatchPreparedStatementSetter() {

                public void setValues(PreparedStatement ps, int i) throws SQLException {
                    ps.setString(1, books.get(i).getName());
                    ps.setBigDecimal(2, books.get(i).getPrice());
                }

                public int getBatchSize() {
                    return books.size();
                }

            });
    }

从此链接: https://mkyong.com/spring/spring-jdbctemplate-batchupdate-example/

谢谢

java spring jdbc jdbctemplate

评论

0赞 M. Deinum 9/27/2023
这是针对MySQL的,而不是Postgres的。您应该检查数据库,而不是来自 java 客户端的日志记录。这可以记录单个查询(MySQL也可以),但实际发送到数据库的SQL是批量插入。rewriteBatchedStatements
0赞 robber 9/28/2023
它看起来也适用于 postgres,jdbc.postgresql.org/documentation/use/......这些查询来自 RDS,而不是来自 java 客户端

答: 暂无答案