我想使用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')
);
答案 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语句中使相同大小即可。