如何在休眠中提交批量插入?

Posted

技术标签:

【中文标题】如何在休眠中提交批量插入?【英文标题】:How to commit batches of inserts in hibernate? 【发布时间】:2012-11-18 11:55:25 【问题描述】:

我必须使用休眠将大量对象保存到数据库中。 我不想一次提交所有这些,而是​​想在会话中存在 n (BATCH_SIZE) 个对象时立即提交。

Session session = getSession();
session.setCacheMode(CacheMode.IGNORE);
for(int i=0;i<objects.length;i++)
    session.save(objects[i]);
    if( (i+1) % BATCH_SIZE == 0)
        session.flush();
        session.clear();
    

我会尝试类似上面的方法,但我读到session.flush() 不会将更改提交到数据库。 这是以下代码的正确方法吗?

Session session = getSession();
session.setFlushMode(FlushMode.COMMIT);
session.setCacheMode(CacheMode.IGNORE);
session.beginTransaction();
for(int i=0;i<objects.length;i++)
    session.save(objects[i]);
    if( (i+1) % BATCH_SIZE == 0)
        session.getTransaction().commit();
        session.clear();
        //should I begin a new transaction for next batch of objects?
        session.beginTransaction();
    

session.getTransaction().commit();

【问题讨论】:

我觉得不错。您将数据库事务保持较小,并清除会话缓存,这样您的堆就不会被分离的实体填满。当然,你应该简单地测试一下——将事务超时设置为一个非常低的数字(例如一分钟),让这段代码持久化大量数据,看看代码是否完成了它的工作。 【参考方案1】:

据我所知,您的解决方案是正确的。

可能只有一个问题: 根据您从 SessionFactory 获取会话的方式,提交也可能会关闭您的会话,您将不得不打开一个新会话。据我所知,如果您使用 getCurrentSession() 和会话上下文“线程”,这总是会发生。如果您使用的是 openSession() 会话似乎不会被提交自动关闭。

您可以在提交事务后使用 isOpen() 方法轻松检查这一点。如果会话关闭,您必须在进一步调用 save() 之前打开一个新会话。

【讨论】:

以上是关于如何在休眠中提交批量插入?的主要内容,如果未能解决你的问题,请参考以下文章

如何优化 Oracle 11g 和 Hibernate 的批量插入?

使用 Hibernate 批量插入或更新?

React Native、GraphQL、Apollo - 如何创建批量插入突变

jdbc 批量插入数据,多少条批量插入效率最高

ibatis批量插入怎么做

批量插入中的 Postgres 错误:关系“hibernate_sequence”不存在位置 17