gpt4 book ai didi

session - 服务器集群中的 JPA 实体

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

我们开始使用 JSF(TomEE 上的 MyFaces)和 JPA (Eclipselink) 开发新的 Web 应用程序。

为了缩短开发时间,我们计划不开发 DTO 层,主要是因为我们不需要它。遵循 JSF 和 Java EE 专家的建议,如 Bauke Scholtz How to use DTO in JSF + Spring + Hibernate和亚当·比恩 How evil are Data Transfer Objects ,我们将直接在表示层中使用 JPA 实体。

然而,该应用程序必须在具有粘性 session 的服务器集群中运行。当一台服务器因维护而停机或被排除在部署应用程序的集群之外时,该服务器的用户 session 必须由其他服务器提供服务,而不会丢失 session 。

我们面临的问题是,保存在 session 中的 JPA 实体(例如在 @ViewScoped bean 中)并未“完全”复制到其他服务器上。事实上,使用延迟加载的 JPA 实体的集合属性在其他服务器上不可用。在具有 session 副本的服务器上访问集合属性(使用延迟加载的@OneToMany)时,出现异常

org.eclipse.persistence.exceptions.ValidationException 
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 relationship is traversed
after serialization.
To avoid this issue, instantiate the LAZY relationship
prior to serialization

被抛出。

我知道 EntityManager 不可序列化,并且 JPA 实体在 session 迁移期间序列化时会完全分离,请参阅 Struberg's Blog .

那么问题来了,有没有一种方法可以在服务器集群中以一致的方式维护 JPA 实体,而不需要使用 EAGER 加载?

最佳答案

您只能为某些实体配置缓存(很少更改一次)

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">

<persistence-unit name="name" transaction-type="JTA">
<!-- disable shared cache because we are in multi instance environment -->
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<validation-mode>CALLBACK</validation-mode>

<properties>
<!-- disable object caching because we are in multi instance environment -->
<property name="eclipselink.cache.shared.default" value="true"/>
<property name="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE"/>
</properties>
</persistence-unit>

</persistence>

您还可以在此处查看如何在共享环境中执行此操作 https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Query_Cache

关于session - 服务器集群中的 JPA 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54784169/

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