在 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();
}
}
我计划使用 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();
}
}