如何在此Spring Boot应用程序中实现Hibernate大量批量插入?

时间:2017-01-02 10:09:13

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

我是Hibernate的新手,我有以下问题:我必须执行大量的插入操作(我需要插入很多模型对象,并且每个对象都包含 byte [] 字段映射数据库上的 blob 字段。

我正在使用 Spring Boot (所以我需要在Spring Boot上配置它)和 Spring Data JPA

所以我有以下情况:

1) RoomMedia 我的模型对象:

@Entity
@Table(name = "room_media")
public class RoomMedia {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    //@Column(name = "id_room")
    //private Long idRoom;

    @ManyToOne
    @JoinColumn(name = "id_room", nullable = false)     // da rinominare anche sul DB in room_fk
    private Room room;

    @Lob
    @Column(name = "media")
    private byte[] media;

    private String description;

    private Date time_stamp;

    public RoomMedia() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    ........................................................................
    ........................................................................
    GETTER AND SETTER METHODS
    ........................................................................
    ........................................................................
}

然后进入另一个类我有这个代码,它持久保存 RoomMedia 对象的列表:

roomMediaDAO.save(mediaListToBeInserted);

其中 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 (?, ?, ?, ?)
............................................................................
............................................................................
............................................................................

所以记录是逐个插入的。

我需要大量插入这些记录,生成如下代码:

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

阅读本文档: https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html 我知道我可以设置Hibernate来执行批量插入,这应该是这样的。

但我有些疑惑:

1)阅读之前的文档链接,它说:

  

如果,Hibernate会透明地禁用JDBC级别的插入批处理   您使用身份标识符生成器。

我知道我的模型对象的主键是注释:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

那意味着什么?我不能做大量插入这些对象的列表?我觉得奇怪的是没有办法做到这一点。

在上一篇文章中解释:

  

您也可以在与之互动的过程中完成此类工作   完全禁用二级缓存:

     

hibernate.cache.use_second_level_cache false

     

但是,这并非绝对必要,因为我们可以明确设置   CacheMode禁用与二级缓存的交互。

所以在我看来,我可以通过某种方式实现,但我不知道这是什么二级缓存以及为什么必须禁用它来执行批量插入对象设置身份标识符生成器。

2)在我的 Spring Boot 项目中,我有这个 application.properties 文件,其中包含与数据库连接和Hibernate配置相关的以下设置。所以我认为这应该是添加集合以处理批量大量插入的点。但是我要设置什么?

#No auth  protected
endpoints.shutdown.sensitive=true
#Enable shutdown endpoint
endpoints.shutdown.enabled=true

spring.datasource.url = jdbc:mysql://XX.YY.ZZZ.WW:3306/BeTriviusTest?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username = MyUserName
spring.datasource.password = MyPswd

spring.datasource.driverClassName=com.mysql.jdbc.Driver

# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

# Show or not log for each sql query
spring.jpa.show-sql = true
spring.jpa.database = mysql
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = validate

# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is
# stripped before adding them to the entity manager)

# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.spatial.dialect.mysql.MySQLSpatial5InnoDBDialect
spring.jpa.database-platform = org.hibernate.spatial.dialect.mysql.MySQLSpatial5InnoDBDialect

0 个答案:

没有答案
相关问题