【问题标题】:Batch update using ParameterizedPreparedStatementSetter vs BatchPreparedStatementSetter on postgreSql?在 postgreSql 上使用 ParameterizedPreparedStatementSetter 与 BatchPreparedStatementSetter 进行批量更新?
【发布时间】:2021-03-11 19:29:36
【问题描述】:

我计划使用 jdbcTemplate 批量更新在每次插入时批量插入大约 2000 条记录。 每条记录的大小平均在 2KB 到 10KB 之间。因此,每次批量更新的更新大小会在 ~ 2 MB 到 10MB 之间变化。

BatchPreparedStatementSetter 对于这个用例是否足够好,还是我真的需要使用 ParameterizedPreparedStatementSetter?

我正在使用 SpringBoot 2.0 和 PostGre 9.6。这些更新的频率将是每分钟两次。

【问题讨论】:

    标签: spring postgresql spring-boot jdbc jdbctemplate


    【解决方案1】:

    BatchPreparedStatementSetter 专为批处理操作而设计。显然BatchPreparedStatementSetter 对你来说很好。

    设置rewriteBatchedStatements=true 将通过减少到数据库sql 语句执行的往返次数来提高批处理操作的性能。 JDBC Batch operations

    当您有更多记录时,最好使用批量大小来拆分它们,这样可以提高性能。使用批量大小和BatchPreparedStatementSetter 实现插入记录更容易。

    例子:

    public class UserBatchPreparedStatementSetter implements BatchPreparedStatementSetter{
      private List<User> users;
      
      public UserBatchPreparedStatementSetter(List<User> users) {
        super();
        this.users = users;
      }
      @Override
      public void setValues(PreparedStatement ps, int i) {
        
        try {
          User user = users.get(i);
          ps.setString(1, user.getUserName());
          ps.setString(2, user.getPassword());
          ps.setDate(3, new java.sql.Date(user.getCreatedTime().getTime()));
          ps.setDate(4, user.getUpdatedTime() == null ? null : new java.sql.Date(user.getUpdatedTime().getTime()));
          ps.setString(5, user.getUserType().toString());
          ps.setDate(6, new java.sql.Date(user.getDateofBirth().getTime()));
        } catch (SQLException e) {
          e.printStackTrace();
        }
      }
      @Override
      public int getBatchSize() {
        return users.size();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多