Java 如何在hibernate中提交批量插入?
我必须使用hibernate将大量对象保存到数据库中。 我希望在会话中出现n个(BATCH_SIZE)对象后立即提交,而不是一次提交所有对象Java 如何在hibernate中提交批量插入?,java,hibernate,commit,flush,batch-insert,Java,Hibernate,Commit,Flush,Batch Insert,我必须使用hibernate将大量对象保存到数据库中。 我希望在会话中出现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 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();
}
}
据我所知,你的解决办法是正确的 可能只有一个问题: 根据您从SessionFactory获取会话的方式,提交也可能会关闭您的会话,您必须打开一个新的会话。据我所知,如果使用getCurrentSession()和会话上下文“thread”,这种情况总是会发生。如果您使用的是openSession(),则会话似乎不会被提交自动关闭
提交事务后,您可以使用isOpen()方法轻松检查这一点。如果会话被关闭,您必须在进一步调用save()之前打开一个新会话。我觉得不错。将数据库事务保持在较小的范围内,并清除会话缓存,这样堆中就不会充满分离的实体。当然,您应该简单地进行测试——将事务超时设置为一个非常低的数字(例如一分钟),并让此代码保留大量数据,然后查看代码是否完成了其工作。
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();