如何优化休眠批量更新?

时间:2019-02-11 20:44:53

标签: java hibernate spring-data-jpa apache-poi

我有一个ETL,它对一堆对象执行批量更新。在本地运行非常快,将更新推送到远程服务器时,该过程要慢得多,幅度大于10。由于机密性,我无法发布任何真实代码,但是发布的内容与真实情况非常相似。

一些背景

  • 标准的弹簧靴项目
  • 具有自动生成的ID并且没有任何形式的联接的标准JPA模型
  • 所有存储库都继承了a
  • 所有批处理更新均调用CrudRepository CrudRepository<T, ID>的以下方法

我尝试了以下操作:

  • 将所有已解析的对象放入相对较大的线程池中,并调用repository.saveAll(objects);并等待完成

application.properties

repository.saveAll(objects);

JPA模型与真实模型非常相似

spring.main.web-application-type=none
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
logging.level.root=INFO

更新服务

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table
public class Item {

    @Id
    @GeneratedValue
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;

    @Column
    private String name;
}

如何将更新添加到线程池,然后等待线程池完成。对象在更新过程中没有ID

@Primary
@Service
public class GenericUpdateServiceImpl implements UpdateService {

    @Override
    public void update(GenericEntityRepository repository, List<?> items) {
        repository.saveAll(items);
    }
}

我希望从本地数据库到远程数据库的过渡会更长一些,但不会是原来的10倍。不使用休眠的数据库查询相对较快。在本地解析单个文件需要不到30秒,而在将文件解析到远程数据库时则需要大约10分钟

0 个答案:

没有答案
相关问题