この議論については同様の質問がたくさんあることは知っていますが、実際に機能するソリューションが必要です。
バッチで一括挿入を行うために、Spring BootとSpring Data JPAを構成しようとしています。
ターゲットは次のとおりです:各Nレコードをコミット、repository.save()
アクションを実行するときにすべてのレコードではありません。
application.properties
で今から試したこと:
spring.jpa.properties.hibernate.jdbc.batch_size=100
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.generate_statistics=true
しかし、成功しませんでした。私はデータベースを監視しており、レコードは、構成したように100行100列ではなく、テーブルごとに永続化されています。
更新
ここに実装があります:
@Component
public class BulkInsert {
@Autowired
MyRepository repository;
public void process() {
PodamFactory podamFactory = new PodamFactoryImpl();
for(int i=0;i<10000;i++) {
MyEntity myEntity = podamFactory.manufacturePojo(MyEntity.class);
repository.save(myEntity);
}
}
}
ここにエンティティがあります:
@Entity
@Table(name="MYTABLE")
@NamedQuery(name="MyEntity.findAll", query="SELECT m FROM MyEntity m")
public class MyEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name="DESCRIPTION")
private String description;
@Id
@Column(name="ID")
private String id;
public MyEntity() {
}
// getters and setters
}
そしてリポジトリ:
public interface MyRepository extends CrudRepository<MyEntity, String> {
}
次のようにコードを変更してみてください:
public void process() {
PodamFactory podamFactory = new PodamFactoryImpl();
List<MyEntity> myEntities = new ArrayList<>(10000);
for(int i = 0; i < 10000; i++) {
myEntities.add(podamFactory.manufacturePojo(MyEntity.class));
}
repository.save(myEntities); // for Spring Boot prior 2.0
// repository.saveAll(myEntities); - for Spring Boot since 2.0
}
追伸オンにすることを忘れないでくださいspring.jpa.show-sql
結果を見る
私の場合、これらの構成でも一括挿入が機能しませんでした。
エンティティがGenerationType.IDENTITY
識別子ジェネレータ。Hibernateはバッチ挿入/更新をサイレントに無効にします。
多分これは他の人を助けるでしょう。
ソース: http://kyriakos.anastasakis.net/2015/06/12/batch-inserts-with-spring-data-and-mysql/
私が使用しています: