gpt4 book ai didi

spring - session 中存储的域对象变得分离

转载 作者:行者123 更新时间:2023-12-02 14:49:32 24 4
gpt4 key购买 nike

我在生产环境中部署了Grails应用程序(2.5.4),该应用程序接收大量流量。

尝试从存储在 session 中的域对象访问字段时,我们遇到间歇性的LazyInitializationException异常。

为了阐明流程的工作原理:

我们有一个过滤器(http://docs.grails.org/2.5.4/ref/Plug-ins/filters.html),该过滤器在每次 Controller 操作之前被调用。在此过滤器中,我们将域对象存储在 session (http://docs.grails.org/2.5.4/ref/Servlet%20API/session.html)中,如下所示:
session.account = Account.get(1)
在 Controller 中,我们像这样检索域:
def account = session.account
然后,我们将域对象传递给另一个服务,该服务调用另一个服务,该服务最终尝试在域对象上调用hasMany字段,如下所示:
account.transactions.name
上面的代码抛出了LazyInitializationException,并带有类似于以下内容的消息:
failed to lazily initialize a collection of role: com.example.app.Account.transactions, no session or session was closed
因此由于某种原因,Hibernate session 在请求完成之前已关闭,因此出现了延迟加载异常。

我们发现在 Controller 中执行以下操作可以完全消除错误的发生:
Account account = Account.findById(session.account.id)
问题是,我不知道为什么,并且想了解为什么在盲目地在应用程序的其他部分中实现此修复程序之前,可以解决此问题。我认为没有理由将对象与Hibernate session 分离,因为此流程都在同一请求中发生。最重要的是,这是一个非常随机的问题-可能会在发出请求的时间的1%内发生,即使不是更少。

为了澄清,问题是;为什么在所有请求都发生在同一请求范围内时关闭 session ,为什么将对象与Hibernate session 分离?另外,为什么它很少会随机发生?

最佳答案

您好,发生这种情况是因为惰性模式将仅缓存域的第一级,因此当您尝试访问其他字段时会出现此错误,并且默认的获取模式通常是惰性的,我会一直这样做在做
帐户帐户= Account.findById(session.account.id)

因为根据另一端列表的大小,将所有内容放入 session 中对您的系统完全不利。

关于spring - session 中存储的域对象变得分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40993971/

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