0

将 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

我在会话 (loginData) 中存储了一个 JPA 实体。该实体有一些延迟加载的属性。所以当我被重定向到实例 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 并不是一个真正的选择...

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

谢谢

4

1 回答 1

0

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

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

于 2013-08-12T11:01:35.187 回答