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

时间:2017-01-01 17:38:59

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

我是 Spring Data JPA Hibernate 的新手,我在插入大量记录时遇到以下问题。

我有以下情况:

1) RoomMediaDAO Spring Data JPA界面:

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

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

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

所以我有以下陈述,坚持列出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 )

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

1 个答案:

答案 0 :(得分:2)

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

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