gpt4 book ai didi

java - 如何使用 Hibernate 进行大量插入?

转载 作者:行者123 更新时间:2023-11-30 02:41:57 24 4
gpt4 key购买 nike

我对 Spring Data JPAHibernate 还很陌生,并且在大量记录插入时遇到以下问题。

我有以下情况:

1) RoomMediaDAO Spring Data JPA 接口(interface):

@Repository
@Transactional(propagation = Propagation.MANDATORY)
public interface RoomMediaDAO extends JpaRepository<RoomMedia, Long> {

....................................................................
....................................................................
....................................................................
}

2)在另一个类中,我使用这个 RoomMediaDAO 来保存 RoomMedia 对象的列表。该列表非常大且重,因为包含许多对象,并且每个对象都包含一个 byte[] 字段,表示映射表上的 BLOB

因此,我有以下语句来保留 List mediaListToBeInserted:

roomMediaDAO.save(mediaListToBeInserted);

它工作正常,但速度非常慢,因为它一一执行插入,事实上在控制台中我可以看到类似这样的内容:

Hibernate: insert into room_media (description, media, id_room, time_stamp) values (?, ?, ?, ?)
Hibernate: insert into room_media (description, media, id_room, time_stamp) values (?, ?, ?, ?)
Hibernate: insert into room_media (description, media, id_room, time_stamp) values (?, ?, ?, ?)
Hibernate: insert into room_media (description, media, id_room, time_stamp) values (?, ?, ?, ?)
Hibernate: insert into room_media (description, media, id_room, time_stamp) values (?, ?, ?, ?)
............................................................................
............................................................................
............................................................................

所以这不是一个好的解决方案。

我如何让 Hibernate 使用单个插入语句插入更多记录?我的意思是我可以使用 Hibernate 做这样的事情吗?

INSERT INTO MyTable ( Column1, Column2 ) VALUES
( Value1, Value2 ),
( Value1, Value2 ),
( Value1, Value2 ),
.................................
.................................
.................................
( Value1, Value2 )

我绝对需要这样的东西来提高我的批处理的性能。

最佳答案

这个link提供了有关执行批量插入的不同方法的详细说明。以斜体字提到的是这些方法的一些问题。

  1. 使用batch_size(提供的链接中的 13.1 部分) - 如果您进行交替插入(非顺序插入到表中,Table1 紧接着 Table2,然后再次 Table1 等等),请记住使用order_inserts
    此外,如果 Generator 的类型为 Identity,则不起作用。
  2. 使用StatelessSession进行插入。 (13.3) - 插入的值不存储在一级缓存中。
    可能会导致数据混叠效应(由于缺少 FLC),还会绕过 Hibernate 的事件模型和拦截器
  3. 使用DML 样式操作
    (仅支持使用 Select 插入,不支持值)
  4. 如果您使用Postgres(或者对于其他数据库,请检查这些数据库是否支持任何批量插入操作,然后利用它是一个非常好的选择)。利用Copy manager具有一次性上传所有这些数据的功能。 Comparison of Performance .
    确保使用的 PushbackReader 没有溢出。我误判了这一点,不得不面对一些刺激。 BufferOverflow 问题。

PS:每种方法都有其优点和缺点。选择适合您的一个。

关于java - 如何使用 Hibernate 进行大量插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41417525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com