2010-08-05 57 views
1

我试图实施在this great blog post for batch processing in grails with MySQL中找到的建议。我遇到的问题是,在循环中包含对session.clear()的定期调用会导致org.hibernate.LazyInitializationException被抛出。在页面的评论部分有一个引用:grails和mysql批处理

你是第二点关于潜在的 导致LIE是绝对正确的。如果 您正在执行 以外的其他任务,则使用当前线程 导入,您需要确保在 之后将任何对象重新连接到 之后。

但我该怎么做?任何人都可以帮助我明确了解如何“在完成清除后将任何对象重新附加到会话中?”我也对并行数据库插入过程感兴趣,以便我可以利用拥有多核处理器的优势。任何人都可以就如何做到这一点Grails中提供建议?

回答

1

Grails的有几个方法来帮助这个(他们的杠杆作用下盖休眠)。

如果你知道一个对象被分离,您可以使用attach重新连接它的方法

如果您已对对象进行更改当它被分开时,你可以使用merge

如果无论出于何种原因,您不确定对象是否附加到会话,您可以使用link text方法找出它是否是。

Session上查看Hibernate文档可能也值得一看。

+0

感谢您的回复。关于如何确定需要重新连接的对象,您有任何建议吗? – vicatcu 2010-08-09 14:58:52

+1

@vicatu不幸的是,它可能是依赖于解决方案的,它取决于clear()期间可能已经分解了哪些对象。你可以尝试的另一件事是,不要强行清除会话,你可以驱逐你在会话中使用的特定域对象。 我还没有尝试过的另一件事是GORM中新的“withNewSession”方法(http://www.grails.org/doc/latest/ref/Domain%20Classes/withNewSession.html)。当我最初编写这篇文章时,它并不在我身边,但可能是更好的方式来包装您的交易并在之后清理。 – 2010-08-09 16:54:20