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

时间:2013-08-08 14:38:12

标签: java jpa glassfish cluster-computing tapestry

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

所以问题是:

  1. 我点击了my.domain.com
  2. 我被重定向到实例1(apache决定将是实例1)
  3. 登录
  4. 关闭实例1
  5. 刷新页面
  6. Apache会将我重定向到实例2
  7. 我在会话中存储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并不是一个真正的选择......

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

    由于

1 个答案:

答案 0 :(得分:0)

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

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