@norepositoryBean public interface BatchRepository<T, ID extends Serializable> extends JpaRepository<T, ID> { <S extends T> void saveInBatch(Iterable<S> entites); }
@Transactional(readOnly = true) public class BatchRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements BatchRepository<T, ID> { private static final Logger logger = Logger.getLogger(BatchRepositoryImpl.class.getName()); private final EntityManager entityManager; public BatchRepositoryImpl(JpaEntity@R_679_4045@ion entity@R_679_4045@ion, EntityManager entityManager) { super(entity@R_679_4045@ion, entityManager); this.entityManager = entityManager; } @Override @Transactional public <S extends T> void saveInBatch(Iterable<S> entities) { if (entities == null) { throw new IllegalArgumentException("The given Iterable of entities cannot be null!"); } int i = 0; for (S entity : entities) { entityManager.persist(entity); i++; // Flush a batch of inserts and release memory if (i % batchSize() == 0 && i > 0) { logger.log(Level.INFO, "Flushing the EntityManager containing {0} entities ...", i); entityManager.flush(); entityManager.clear(); i = 0; } } if (i > 0) { logger.log(Level.INFO, "Flushing the remaining {0} entities ...", i); entityManager.flush(); entityManager.clear(); } } private static int batchSize() { int batchsize = Integer.valueOf(Dialect.DEFAULT_BATCH_SIZE); // default batch size Properties configuration = new Properties(); try (InputStream inputStream = BatchRepositoryImpl.class.getClassLoader() .getResourceAsstream("application.properties")) { configuration.load(inputStream); } catch (IOException ex) { logger.log(Level.SEVERE, "Cannot fetch batch size. Using further Dialect.DEFAULT_BATCH_SIZE{0}", ex); return batchsize; } String batchsizestr = configuration.getProperty( "spring.jpa.properties.hibernate.jdbc.batch_size"); if (batchsizestr != null) { batchsize = Integer.valueOf(batchsizestr); } return batchsize; } }
Why To Avoid Postgresql (BIG)SERIAL In Batching Inserts Via Hibernate
https://github.com/AnghelLeonard/Hibernate-SpringBoot/tree/master/HibernateSpringBootBatchingAndSerial
自增列 EntityManager (MysqL)
https://github.com/AnghelLeonard/Hibernate-SpringBoot/tree/master/HibernateSpringBootBatchInsertsEntityManagerBatchPerTransaction
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。