繁体   English   中英

Glassfish群集和JPA的延迟加载问题

[英]Lazy loading problems with glassfish cluster and JPA

将EAR部署到glassfish 3.1集群时遇到问题。 设置是这样的:我的主机PC上的群集1在2个VM Apache上具有2个实例,并带有mod_jk以在2个实例之间进行负载平衡(带有粘性会话)Tapestry 4.x Web应用程序

所以问题是:

  1. 我点击了my.domain.com
  2. 我被重定向到实例1(apache决定将其为实例1)
  3. 登录
  4. 关闭实例1
  5. 刷新页面
  6. Apache将我重定向到实例2

我将JPA实体存储在会话(loginData)中。 该实体具有一些延迟加载的属性。 因此,当我重定向到实例2时,我会看到一条错误消息:

Exception Description: An attempt was made to traverse a relationship using indirection         that had a null Session. 
This often occurs when an entity with an uninstantiated LAZY relationship is serialized and that lazy relationship is traversed after serialization. 
To avoid this issue, instantiate the LAZY relationship prior to serialization.

因此,我猜测是在序列化该对象时,该对象仍未随所有属性一起膨胀。

如果我将其更改为fetch = EAGER,则一切正常。

更改为EAGER并不是真正的选择。

任何想法如何解决这个问题?

谢谢

在您的HttpSession中存储JPA实体是一个坏主意。 将您的实体生存期限制为一个HttpRequest并为自己节省很多问题。 将实体ID存储在您的会话中,并使用该ID在每次请求时获取您的实体。 可能使用JPA /休眠缓存选项来防止每次命中数据库。

根据您的情况,这意味着登录后将实体的@Id值存储在HttpSession中。 然后,当实例2尝试从HttpSession中获取实体时,它将仅获取ID并使用该ID来获取刷新请求范围内的实际实体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM