atr*_*thi 5 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.flush();
session.clear();
}
}
Run Code Online (Sandbox Code Playgroud)
我会尝试类似上面的东西,但我读到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();
Run Code Online (Sandbox Code Playgroud)
据我所知,您的解决方案是正确的。
可能只有一个问题:根据您从 SessionFactory 获取会话的方式,提交也可能会关闭您的会话,并且您必须打开一个新会话。据我所知,如果您使用 getCurrentSession() 和会话上下文“线程”,这种情况总是会发生。如果您使用 openSession() ,会话似乎不会被提交自动关闭。
提交事务后,您可以使用 isOpen() 方法轻松检查这一点。如果会话关闭,您必须在进一步调用 save() 之前打开一个新会话。
| 归档时间: |
|
| 查看次数: |
1902 次 |
| 最近记录: |