我准备了List<BinValue> binValues
变量中的新实体列表。
然后我想保存它。
我注意到,如果用
保存它们for(BinValue binValue : binValues) {
binValueRepo.save(binValue);
}
然后它的效果很慢。
如果用
保存binValueRepo.save(binValues);
它尝试使用多个连接,但如果将连接限制为1,那么也会非常慢。
是否可以通过序列化
来加速保存INSERT INTO MyTable (Field1, Field2) VALUES ('Value1','Value2'), ('ValueA', 'ValueB')...
有多个元组并在一批中运行?
更新
我写了这个
@Override
@Transactional
public void saveBulkNewEntities(Iterable<BinValue> binValues) {
StringBuilder sb = new StringBuilder();
sb.append("INSERT INTO bin_values (bin_id, region_id, value) VALUES ");
boolean juststarted = true;
for(BinValue binValue : binValues) {
if( !juststarted ) {
sb.append(", ");
}
else {
juststarted = false;
}
sb.append("(");
sb.append(binValue.getBin().getId());
sb.append(", ");
sb.append(binValue.getRegion().getId());
sb.append(", ");
sb.append(String.format(Locale.US, "%f", binValue.getValue()));
sb.append(")");
}
Query query = em.createNativeQuery(sb.toString());
em.joinTransaction();
query.executeUpdate();
}
并获得了巨大的速度!为什么!?