【发布时间】: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