gpt4 book ai didi

hibernate - 带有集合的Grails LazyInitializationException

转载 作者:行者123 更新时间:2023-12-02 15:16:31 24 4
gpt4 key购买 nike

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

我有一个非常活跃的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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com