【发布时间】: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();
【问题讨论】:
-
我觉得不错。您将数据库事务保持较小,并清除会话缓存,这样您的堆就不会被分离的实体填满。当然,你应该简单地测试一下——将事务超时设置为一个非常低的数字(例如一分钟),让这段代码持久化大量数据,看看代码是否完成了它的工作。
标签: java hibernate commit flush batch-insert