我真的不明白我做错了什么,因为插入30000行需要大约20分钟。我也试图插入30000与datagrip和它只需要像1秒。我也在考虑组成一个字符串的数据SQL和执行它。
public Mono<Boolean> insertOrders(List<ClientOrder> orders) {
if (orders.isEmpty()) {
return Mono.just(true);
} else {
return databaseClient.inConnectionMany(connection -> {
Statement statement = connection.createStatement(OrderQueries.INSERT_ORDERS);
for (int i = 0; i < orders.size(); ) {
var order = orders.get(i);
statement.bind("$1", order.getUserId())
.bind("$2", order.getUserName())
.bind("$3", order.getCustomerEmail())
.bind("$4", order.getCustomerMobile())
.bind("$5", order.getAmount())
.bind("$6", order.getCreateDate())
.bind("$7", order.getStatusChangeDate());
if (++i < orders.size()) {
statement.add();
}
}
return Flux.from(statement.execute()).flatMap((result -> result.map(((row, rowMetadata) -> row.get("id", Long.class)))));
}).doOnError((error) ->
System.out.println(error.getMessage())
).collectList().map((list) -> {
return list.size() == orders.size();
});
字符串
我想得到一些关于在postgres上使用spring Boot r2dbc进行多次插入的建议。
1条答案
按热度按时间ac1kyiln1#
我也使用了类似的解决方案来插入多个实体https://github.com/hantsy/spring-r2 dbc-sample/blob/master/database-client/src/main/java/com/example/demo/PostRepository.java#L90,这只是一个例子。
我以前在将数据从旧数据库迁移到新数据库时遇到过类似的性能问题。
但对于你的情况,根据我以前的经验,我认为最好是打破长名单,以较小的批次。
例如,一个批次中有50个项目,当插入计数器达到50时,提交事务并将数据刷新到数据库中,然后将计数器重置为下一次迭代,直到所有数据插入。