【发布时间】:2019-08-13 15:36:28
【问题描述】:
我看到之前已经发布过类似的问题,但标准建议的解决方案似乎不适用于我的情况,我想了解原因。
我有一个 Grails 2.2.5 应用程序,正在非常活跃地使用,我一直在研究报告涉及相当大的数据集的问题。有问题的域类是 Policy,它有一个 hasMany of 'events',属于 Event 类。对于报告,我在两个日期之间对 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 个策略对象),就可能会出现会话问题。或者可能与超时有关 - 完成条件查询大约需要 90 秒,即使它只使用一个索引列(为什么??)。
无论如何,我读了一些关于惰性初始化和急切初始化的文章,似乎我应该能够通过以下两种方式之一解决这个问题,或者通过在父映射中为集合设置“惰性:假”域类,或在查询级别,通过在条件内设置“fetchMode”,因此:
fetchMode("events",FetchMode.SELECT)
现在,类似的问题出现在两个不同的地方(具有不同的集合),在其中一个地方我使用了域类方法,它已经解决了这个问题。但是,在这里,我真的不想让初始化无处不在,因为整体影响太大,我想在查询级别进行。但是将上面的 fetchMode 添加到标准中没有任何区别,我仍然看到 LazyInitializationException,这让我感到困惑。为什么这不能解决我的问题?考虑到其他地方的代码基本相同但结果较少,为什么我首先会遇到会话问题?
【问题讨论】:
-
请注意,上游错误(在您延迟加载事件之前)可能会关闭当前休眠会话并导致此错误。显然,我不知道这是否是导致您出现错误的原因,但根据我的经验,当出现无法解释的延迟加载问题时,它们通常是早期问题的结果。
-
在这种情况下可能会出现什么“上游错误”?
-
在您到达加载事件的代码行之前出现的任何错误(并引发异常,即使它后来被捕获)。
-
啊,好的。那么,如果抛出了异常,那么代码执行肯定会在该点停止,并且加载事件的代码将永远不会运行?
-
如果异常在一个地方抛出并在另一个地方捕获,则不会。事务方法中的异常仍然可以将事务标记为回滚,即使它后来被捕获。
标签: hibernate grails grails-2.0