hibernate - 带有集合的Grails LazyInitializationException

标签 hibernate grails grails-2.0

我看到类似的问题已经发布过,但是标准建议的解决方案似乎不适用于我,我想了解原因。

我有一个非常活跃的Grails 2.2.5应用程序,而且我一直在调查涉及大量数据集的报告问题。所讨论的域类是Policy,它具有Event类的hasmany'events'。对于报告,我在两个日期之间对Policy进行了标准搜索,然后循环浏览Policy对象,查看“事件”集合(以及其他字段)并构建报告。在整个应用程序的其他地方都使用了相同的标准技术,并且迄今为止已证明是没有问题的。但是,现在,在遍历Policy对象时,我看到如下错误消息:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.blah.Policy.events, no session or session was closed

看起来,一旦您超过某个数据大小(在这种情况下,大约为75,000个Policy对象),就有可能发生 session 问题。也许是与超时有关-即使仅使用一个索引列也要花费大约90秒才能完成条件查询(为什么?)。

无论如何,我读了一些关于延迟与急切初始化的文章,看来我应该可以通过以下两种方式之一解决此问题:通过在父域类的映射中为集合设置“lazy:false”,或在查询级别,通过在条件内设置“fetchMode”,从而:
fetchMode("events",FetchMode.SELECT)

现在,在两个不同的地方(具有不同的集合)发生了类似的问题,在其中一个地方,我使用了域类方法,从而解决了该问题。不过,在这里,我并不是真的想在每个地方都渴望初始化,因为总体上影响太大,所以我想在查询级别进行初始化。但是将上述fetchMode添加到条件中并没有什么区别,我仍然看到LazyInitializationException,这使我感到困惑。为什么这不能解决我的问题?又为什么我会首先遇到 session 问题,因为其他地方使用的代码基本相同,但结果却很少,所以我看不到任何问题?

最佳答案

这些可能很难解决。但是您肯定会使用fetchMode寻找正确的方向。但是,我很可能会分批处理整个事情(如果可能的话),从而消除了长时间运行的查询/ session 事务。一次可能200个。这很容易采用

maxResults(maxPerBatch)
firstResult(batchOffset)

根据您的标准。

如果您认为查询运行时间过长,请在数据源中放入logSql = true,然后查看休眠状态,并确定是否需要添加fetchMode进行连接。如果这变得不可修复,请考虑切换到HQL,以后甚至改用SQL。

关于hibernate - 带有集合的Grails LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57481111/

相关文章:

grails - 为 Grails 邮件插件生成 HTML 邮件模板的最佳方法是什么?

java - 具有 Activity 事务和连接打开的 LazyInitializationException

java - 限制 Gpars 中的线程数?

grails - 从对象读取字符串

grails - 运行 grails 项目时出现 java.io.IOException

grails - 如果包含GORM查询,如何在Grails中将字符串转换为一段代码?

java - 如何使用 @Transactional 注释测试方法

java - 线程中的异常 "main"org.hibernate.InvalidMappingException : Could not parse mapping document from resource userdata. hbm.xml

java - Spring + hibernate + HikariCP : how to handle DB connection while doing long running REST call?

java - 我如何删除没有belongs的grails中有很多关系