首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在postgreSql上使用ParameterizedPreparedStatementSetter与BatchPreparedStatementSetter进行批量更新?

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

Stack Overflow用户
提问于 2020-11-30 03:07:51
回答 1查看 236关注 0票数 0

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-03 11:25:36

专为批处理操作设计的BatchPreparedStatementSetter。显然,在您的情况下,BatchPreparedStatementSetter很好。

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

当您有更多的记录时,最好使用批处理大小来拆分它们,这样可以提高性能。在BatchPreparedStatementSetter中使用batch size插入记录更容易。

示例:

代码语言:javascript
复制
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();
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65064033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档