我正在设置一个wildfly实例集群来运行我的应用程序。它使用休眠来保持其持久性。
我使用来自standalone-ha.xml的infinispan配置,jgroups我改为使用tcp ping,因为我无法在我的环境中使用多播。
会话复制工作正常,我的mod_jk负载均衡器没有使用粘性会话,集群中的两个服务器(仅测试2个)正在成功提供页面。
我遇到了休眠的间歇性问题:
2016-08-16 10:14:47,518 INFO [stdout] (default task-8) Caused by: java.lang.NullPointerException: null
2016-08-16 10:14:47,518 INFO [stdout] (default task-8) at org.hibernate.collection.internal.AbstractPersistentCollection.openTemporarySessionForLoading(AbstractPersistentCollection.java:274)
2016-08-16 10:14:47,518 INFO [stdout] (default task-8) at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:201)
2016-08-16 10:14:47,519 INFO [stdout] (default task-8) at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:546)
2016-08-16 10:14:47,519 INFO [stdout] (default task-8) at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:133)
2016-08-16 10:14:47,519 INFO [stdout] (default task-8) at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:277)
我正在使用正在运行hibernate 5的wildfly 10。
该类用于延迟加载列表(具有一对多关系)等等。
这里有一些代码:
@Table(name = "[User]")
@Entity
public class User extends CommonDomainBase
{
@OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true, mappedBy = "user", fetch = FetchType.LAZY)
private List<UserSearchingPreference> searchingPreferences;
public List<UserSearchingPreference> getSearchingPreferences()
{
return searchingPreferences;
}
}
从我所看到的情况来看,sessionFactoryUuid
将被序列化。因此,如果用户在服务器1上加载,复制到服务器2,并且命中服务器2的另一个请求尝试调用getSearchingPreferences()
与服务器1上的休眠会话相关的sessionFactoryUuid
不能用于在服务器2上查找会话,因为它不存在。
是否有人能够确认我的假设是否正确并提出解决方案?
我不确定这是否是需要调整的某些hibernate配置,或者我是否应该以某种方式在复制之前分离对象。