为了账号安全,请及时绑定邮箱和手机立即绑定

在 Hibernate 中快速插入许多实体

在 Hibernate 中快速插入许多实体

慕无忌1623718 2022-11-30 11:25:25
我想使用 Hibernate 4.2 将 170.000 个实体的列表插入到我本地安装的 MySQL 8.0 数据库中。目前我正在通过 Session#save 方法执行此操作。但是插入那么多实体会持续很长时间。那么是否有可能更快地做到这一点?for (Agagf x : list) {    create(x);}// ------------------------    public static void create(Object obj) throws DatabaseException {        Session hsession = null;        try {            hsession = SqlDataHibernateUtil.getSessionFactory().openSession();            Transaction htransaction = hsession.beginTransaction();            hsession.save(obj);            htransaction.commit();        } catch (HibernateException ex) {            throw new DatabaseException(ex);        } finally {            if (hsession != null)                hsession.close();        }    }
查看完整描述

1 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

Hibernate 页面上有这篇文章:http: //docs.jboss.org/hibernate/orm/4.2/manual/en-US/html/ch15.html

根据他们的说法,你需要这样的东西:

create(list);


// ------------------------


public static void create(List<Object> objList) throws DatabaseException {

  Session hsession = null;


  try {

    hsession = SqlDataHibernateUtil.getSessionFactory().openSession();

    Transaction htransaction = hsession.beginTransaction();


    int count = 0;

    for(Agagf x: objList) {

        hsession.save(obj);

        if ( ++count % 20 == 0 ) { //20, same as the JDBC batch size

            //flush a batch of inserts and release memory:

            hsession.flush();

            hsession.clear();

            count = 0;

        }

    }

  } catch (HibernateException ex) {

    throw new DatabaseException(ex);

  } finally {

    htransaction.commit();

    if (hsession != null) {

      hsession.close();

    }

  }

}

此外,启用批处理的配置:


如果您正在进行批处理,则需要启用 JDBC 批处理。如果您想获得最佳性能,这是绝对必要的。将 JDBC 批处理大小设置为合理的数字(例如 10-50):


hibernate.jdbc.batch_size 20

编辑:在你的情况下,使用批量大小来更好地适应你的体积。请记住在配置和 if 语句中为刷新设置相同的大小。


查看完整回答
反对 回复 2022-11-30
  • 1 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信