在 postgreSql 上使用 ParameterizedPreparedStatementSetter 与 BatchPreparedStatementSetter 进行批量更新?
Posted
技术标签:
【中文标题】在 postgreSql 上使用 ParameterizedPreparedStatementSetter 与 BatchPreparedStatementSetter 进行批量更新?【英文标题】:Batch update using ParameterizedPreparedStatementSetter vs BatchPreparedStatementSetter on postgreSql? 【发布时间】:2021-03-11 19:29:36 【问题描述】:我计划使用 jdbcTemplate 批量更新在每次插入时批量插入大约 2000 条记录。 每条记录的大小平均在 2KB 到 10KB 之间。因此,每次批量更新的更新大小会在 ~ 2 MB 到 10MB 之间变化。
BatchPreparedStatementSetter 对于这个用例是否足够好,还是我真的需要使用 ParameterizedPreparedStatementSetter?
我正在使用 SpringBoot 2.0 和 PostGre 9.6。这些更新的频率将是每分钟两次。
【问题讨论】:
【参考方案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();
【讨论】:
以上是关于在 postgreSql 上使用 ParameterizedPreparedStatementSetter 与 BatchPreparedStatementSetter 进行批量更新?的主要内容,如果未能解决你的问题,请参考以下文章
Exception:java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.Paramete
使用 brew 在 mac 上安装特定版本的 postgresql
在 PostgreSQL 上使用 SQLAlchemy 创建全文搜索索引
Django/PostgreSQL 全文搜索 - 在 AWS RDS PostgreSQL 上使用 SearchVector 与 SearchVectorField 时的不同搜索结果