在Hibernate中快速插入许多实体

时间:2019-05-15 09:58:25

标签: java mysql hibernate

我想使用Hibernate 4.2将170.000个实体的列表插入本地安装的MySQL 8.0数据库中。 目前,我正在通过Session#save方法执行此操作。但是插入这么多实体会持续很长时间。那么有可能更快地做到这一点吗?

this.authService.authenticationState.subscribe(state => {
      this.isLoggedIn = state;
    },
    err => console.log(err),
    () => console.log('complete')
    );

1 个答案:

答案 0 :(得分:0)

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语句中使相同大小即可。