在大事务中安全地清理Hibernate会话 [英] Safely clearing Hibernate session in the middle of large transaction

查看:98
本文介绍了在大事务中安全地清理Hibernate会话的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Spring + Hibernate进行一项操作,该操作需要创建和更新几十万个项目。像这样:

  {
...
Foo foo = fooDAO.get(... );
for(int i = 0; i <500000; i ++){
Bar bar = barDAO.load(i);
if(bar.needsModification()& foo.foo()){
bar.setWhatever(new whatever);
barDAO.update(bar);
// commit here
Baz baz = new Baz();
bazDAO.create(baz);
// if(i%100 == 0),clear
}
}
}

为了保护自己免受中间变更的损失,我立即在 barDAO.update(bar)

  HibernateTransactionManager transactionManager = ...; //由Spring注入
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus transactionStatus = transactionManager.getTransaction(def);
transactionManager.commit(transactionStatus);

在这一点上,我必须说整个过程运行在一个事务中,包装到 org.springframework.orm.hibernate3.support.ExtendedOpenSessionInViewFilter (是的,这是一个web应用程序)。



例外:在数千次更新/提交之后,整个过程变得非常缓慢,很可能是由于内存由于Spring / Hibernate保存的不断增加的对象而变得臃肿。



在仅限Hibernate的环境中,通过调用 org.hibernate.Session#clear()很容易解决这个问题。



现在,问题:

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆