休眠 - Hazelcast。第二关cache.Could 找不到SessionFactory异常
Hibernate - Hazelcast. Second level cache.Could not find a SessionFactory exception
图例:
- 2 个应用程序实例,每个实例都带有 Hazelcast。
- 集群中配置的 Hazelcast 实例。配置已正确配置,已执行同步(在手动模式下测试)。
- Hibernate 使用 Hazelcast 作为二级缓存提供程序。
在应用程序中存在具有下 class 级注释的实体:
@Entity
@Cache( usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE )
@Table( name = "entity", catalog = "main" )
@IdClass( EntityPK.class )
在第一个实例上对该实体执行数据库更新时,在第二个实例上抛出异常 com.hazelcast.nio.serialization.HazelcastSerializationException: org.hibernate.HibernateException: Could not find a SessionFactory [uuid=ee9f3ccd-1f7e-4345-83ed-e58440a52123,name=null]
。
调试后我找到了这个异常的原因 - 它在反序列化期间由 org.hibernate.type.spi.TypeConfiguration.Scope#readResolve
方法抛出。此 class 的实例是默认 Hibernate 缓存键对象的一部分。
据我了解。
导致问题的对象是 "session scoped"。换句话说,它绑定到特定的 SessionFactory 并在其字段中包含会话工厂 UUID 和对工厂本身的引用。在序列化期间,工厂 UUID 被保留。执行反序列化时,对象尝试将 link 恢复到其工厂,但它在其他实例中反序列化,其中不存在具有指定 UUID 的会话工厂。因为会话工厂丢失异常被抛出。
有没有办法避免这个异常?
下一个是 Hibernate 和相关库版本:
<hibernate.version>5.3.14.Final</hibernate.version>
<hibernate-types-52.version>2.5.0</hibernate-types-52.version>
<hazelcast.version>3.11.5</hazelcast.version>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-hibernate53</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>${hibernate-types-52.version}</version>
</dependency>
在您的 Hibernate 配置中,包括以下内容 属性:
<property name="hibernate.session_factory_name">some_sf_name</property>
当使用复合主键时,它被映射到 org.hibernate.usertype.UserType
,后者引用了 SessionFactory。这就是为什么另一个实例在找不到合适的 SF 时引发错误的原因。
来自休眠 doc:
hibernate.session_factory_name (e.g. A JNDI name):
Setting used to name the Hibernate SessionFactory. Naming the SessionFactory allows for it to be properly serialized across JVMs as long as the same name is used on each JVM.
图例:
- 2 个应用程序实例,每个实例都带有 Hazelcast。
- 集群中配置的 Hazelcast 实例。配置已正确配置,已执行同步(在手动模式下测试)。
- Hibernate 使用 Hazelcast 作为二级缓存提供程序。
在应用程序中存在具有下 class 级注释的实体:
@Entity
@Cache( usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE )
@Table( name = "entity", catalog = "main" )
@IdClass( EntityPK.class )
在第一个实例上对该实体执行数据库更新时,在第二个实例上抛出异常 com.hazelcast.nio.serialization.HazelcastSerializationException: org.hibernate.HibernateException: Could not find a SessionFactory [uuid=ee9f3ccd-1f7e-4345-83ed-e58440a52123,name=null]
。
调试后我找到了这个异常的原因 - 它在反序列化期间由 org.hibernate.type.spi.TypeConfiguration.Scope#readResolve
方法抛出。此 class 的实例是默认 Hibernate 缓存键对象的一部分。
据我了解。 导致问题的对象是 "session scoped"。换句话说,它绑定到特定的 SessionFactory 并在其字段中包含会话工厂 UUID 和对工厂本身的引用。在序列化期间,工厂 UUID 被保留。执行反序列化时,对象尝试将 link 恢复到其工厂,但它在其他实例中反序列化,其中不存在具有指定 UUID 的会话工厂。因为会话工厂丢失异常被抛出。
有没有办法避免这个异常?
下一个是 Hibernate 和相关库版本:
<hibernate.version>5.3.14.Final</hibernate.version>
<hibernate-types-52.version>2.5.0</hibernate-types-52.version>
<hazelcast.version>3.11.5</hazelcast.version>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-hibernate53</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>${hibernate-types-52.version}</version>
</dependency>
在您的 Hibernate 配置中,包括以下内容 属性:
<property name="hibernate.session_factory_name">some_sf_name</property>
当使用复合主键时,它被映射到 org.hibernate.usertype.UserType
,后者引用了 SessionFactory。这就是为什么另一个实例在找不到合适的 SF 时引发错误的原因。
来自休眠 doc:
hibernate.session_factory_name (e.g. A JNDI name): Setting used to name the Hibernate SessionFactory. Naming the SessionFactory allows for it to be properly serialized across JVMs as long as the same name is used on each JVM.