【问题标题】:Batch Insert with JPA and Spring使用 JPA 和 Spring 进行批量插入
【发布时间】:2014-11-14 23:37:51
【问题描述】:

我正在使用 Spring Framework 和 JPA 将 bean 插入到我的数据库中。我需要插入将近 8000 个实体,这可能会延迟太多。

  1. 为什么要在 Hibernate 中禁用“二级缓存”hibernate.cache.use_second_level_cache false

  2. 当我在 Hibernate 中设置“hibernate.jdbc.batch_size 20”时,它会像这样插入我的 bean 吗?

INSERT INTO VALUES (1),(2),(3)...(20);
INSERT INTO VALUES (21),(2),(3)...(40);
  1. 文档说:“如果您使用身份标识符生成器,​​Hibernate 会透明地禁用 JDBC 级别的插入批处理。”。所以,我所有的 bean 都有这个配置:

@Id
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
private Integer id;

当我在上面使用这个身份时,批量插入是否被禁用?我该如何解决这个问题?

【问题讨论】:

    标签: java spring hibernate jpa


    【解决方案1】:

    在 Hibernate 中,您不能禁用会话级缓存。如果您不想要它,请使用 StatelessSession 。这不会缓存任何东西。

    此外,Hibernate 文档指定了如何进行批量插入。见here

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    
    for ( int i=0; i<100000; i++ ) {
        Customer customer = new Customer(.....);
        session.save(customer);
        if ( i % 20 == 0 ) { //20, same as the JDBC batch size
            //flush a batch of inserts and release memory:
            session.flush();
            session.clear();
        }
    }
    
    tx.commit();
    session.close(); 
    

    【讨论】:

    • 如果我不能禁用二级缓存为什么要使用这个属性:hibernate.cache.use_second_level_cache false。我需要知道我是否使用身份标识符,我的批量插入被禁用。
    • 二级缓存和会话级缓存是两个不同的东西。您可以禁用前者,但不能禁用后者
    • 是的,我没有禁用会话级缓存,只是二级缓存(如我在帖子中所示)。
    猜你喜欢
    • 2020-03-18
    • 2010-10-01
    • 2023-04-03
    • 2012-03-31
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2011-12-14
    相关资源
    最近更新 更多