【问题标题】:Hibernate Postgres Slow InsertHibernate Postgres 慢速插入
【发布时间】:2018-02-16 18:58:52
【问题描述】:

我尝试使用 JPA/Hibernate/Postgres 将数据插入 Postgres。 数据是从 CSV 文件中解析出来的,然后应该保存到 postgres 数据库中。持久化数据的代码如下:

        @Autowired
    KundeRepository repo;
    @Transactional
    public void safe(Kunde kd) {
        repo.save(kd);
    } 
 public void safeAll(Iterable<Kunde> kt) {
        repo.save(kt);
        repo.flush();
    }

实体如下所示

public class account implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    }
    @ManyToOne
    Kunde kunde;
    @OneToMany
    List<TransaktionsGruppe> gruppen;


       @Entity
@Table(name = "kunde")
@NoArgsConstructor
public class Kunde implements Serializable {

    public static final String kundennummerKey = "KUNDENNUMMER";

    private static final long serialVersionUID = 1L;

    @Id
    @Getter
    @Setter
    private String id;  
    @OneToMany
    List<Account> accounts;



    @Entity
@Table(name = "transaktionsgruppe")
public class Transaktionsgruppe  implements Serializable {


    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @ManyToOne
    Account acc;

    private String bezeichnung;

当我现在将 Collection 传递给 safeAll 方法时,插入非常慢。特别是它似乎为每个插入调用休眠序列。有没有办法加快速度?

我的配置如下:

datasource:
       type: com.zaxxer.hikari.HikariDataSource
       url: dburl
       username: user
       password: pw
       hikari:
         validation-timeout: 10000
         health-check-properties: {"connectivityCheckTimeoutMs","1000"}
jpa:
    show-sql: true
    properties:
        hibernate.cache.use_second_level_cache: false
        hibernate.cache.use_query_cache: false
        hibernate.generate_statistics: false
        hibernate.jdbc.batch.size: 100
        hibernate.order_inserts: true+

目前已启用 show-sql。总共大约 60000 个实体,需要 20 多分钟。实体的大小相当小

【问题讨论】:

  • 慢多少?有多少实体?你在哪个级别设置了@Transactional注解?你试过 show-sql: false 吗?请编辑您的问题以添加这些详细信息。
  • 在 PostgreSQL 上进行 ETL(提取、转换和加载)时,ORM 会导致速度显着降低。获取数据的最快方法是将其序列化回 CSV,然后使用 COPY 命令将其插入表中。在 Postgresql 上没有什么比 COPY 更快的了。
  • 我添加了更多细节。使用复制命令不是一个选项,因为我已将该行拆分为多个表。
  • 那么慢?
  • 看起来你已经完成了弗拉德在他的博客中描述的事情 - vladmihalcea.com/… 你的Transaction 边界在哪里?如果每个插入都在自己的事务中运行,那么它会很慢,并且您的批处理设置不会有任何影响。 KundeRepository 内部发生了什么?

标签: postgresql hibernate jpa jhipster


【解决方案1】:

您的safeAll() 方法没有使用@Transactional 注释,因此Spring 为您列表中的每个项目打开和关闭一个事务。通过注释它,Spring 将为整个列表打开和关闭一个事务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 2016-05-22
    • 2015-07-03
    • 1970-01-01
    • 2022-01-15
    • 2014-10-30
    • 1970-01-01
    相关资源
    最近更新 更多