在 postgreSql 上使用 ParameterizedPreparedStatementSetter 与 BatchPreparedStatementSetter 进行批量更新?

Batch update using ParameterizedPreparedStatementSetter vs BatchPreparedStatementSetter on postgreSql?

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

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

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

BatchPreparedStatementSetter专为批处理操作而设计。显然 BatchPreparedStatementSetter 适合你的情况。

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

当您有更多记录时,最好使用批量大小拆分它们,这样可以提高性能。使用 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();
  }
}