我有一个与org.infinispan.jmx.JmxDomainConflictException: Domain already registered org.infinispan Exception?部分相关的问题,区别在于我在JBoss 7.1.1中使用了hibernate 4.3.6。我有两个应用程序,其persistence.xml大致如下:
<persistence>
<persistence-unit name="..." transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=...)</jta-data-source>
<class>...</class>
<shared-cache-mode>ALL</shared-cache-mode>
<properties>
<property name="hibernate.cache.use_query_cache"
value="true" />
<property name="hibernate.cache.use_second_level_cache"
value="true" />
<property name="hibernate.cache.infinispan.container"
value="hibernate-exp" />
<property name="hibernate.cache.region.factory_class"
value="org.hibernate.cache.infinispan.InfinispanRegionFactory" />
</properties>
</persistence-unit>
</persistence>
当第二个应用程序的持久性单元被hibernate加载时,会发生异常。现在网上的解决方案经常提到将其添加到infinispan-config:
<globalJmxStatistics allowDuplicateDomains="true" />
但是这个配置文件是hibernate-infinispan模块的一部分,所以我不能简单地修改它。这issue seems to be fixed,但我很遗憾地被限制使用infinispan 6.有什么建议吗?
编辑:我希望能够使用JBoss AS缓存管理器。这就是设置hibernate.cache.infinispan.container
并在hibernate-ext
中domain.xml
配置<domain xmlns="urn:jboss:domain:1.2">
<profiles>
<profile name="full">
<subsystem xmlns="urn:jboss:domain:infinispan:1.2" default-cache-container="hibernate">
<cache-container name="hibernate-exp" default-cache="local-query">
<local-cache name="entity">
<transaction mode="NONE"/>
<eviction strategy="@hibernate.expireable.eviction.strategy@" max-entries="@hibernate.expireable.eviction.max_entries@"/>
<expiration max-idle="@hibernate.expireable.expiration.max_idle@" interval="@hibernate.expireable.expiration.interval@"/>
<locking concurrency-level="@hibernate.expireable.locking.concurrency_level@"/>
</local-cache>
<local-cache name="local-query">
<transaction mode="NONE"/>
<eviction strategy="@hibernate.expireable.eviction.strategy@" max-entries="@hibernate.expireable.eviction.max_entries@"/>
<expiration max-idle="@hibernate.expireable.expiration.max_idle@" interval="@hibernate.expireable.expiration.interval@"/>
<locking concurrency-level="@hibernate.expireable.locking.concurrency_level@"/>
</local-cache>
<local-cache name="timestamps">
<transaction mode="NONE"/>
<eviction strategy="NONE"/>
</local-cache>
</cache-container>
</subsystem>
</profile>
</profiles>
</domain>
的原因:
hibernate.cache.infinispan.container
然而,遗漏org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given; please either disable second level cache or set correct region factory using the hibernate.cache.region.factory_class setting and make sure the second level cache provider (hibernate-infinispan, e.g.) is available on the classpath.
会出现异常:
org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory
我不知道为什么会出现这种错误,因为hibernate-infinispan,infinispan-commons和infinispan-core都在hibernate的类路径上。我不确定,但这可能与某些事实有关,我将两个不同的hibernate版本部署到JBoss(4.0.1和4.3.6)。没有属性的配置适用于4.0.1,但不适用于4.3.6。
如果我使用java.lang.ClassCastException: org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory cannot be cast to org.hibernate.cache.spi.RegionFactory
at org.hibernate.cfg.SettingsFactory.createRegionFactory(SettingsFactory.java:478)
我
org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory
...因为来自jboss-as-jpa-hibernate4的RegionFactory
从Hibernate 4.0.1连接到SettingsFactory
。使用过的RegionFactory
来自Hibernate 4.3.6,并尝试将其从自己的模块转换为hibernate.cache.region.factory_class
。
edit2:在调试器的帮助下我发现,如果我使用Hibernate 4.0.1,属性org.jboss.as.jpa.hibernate4.infinispan.SharedInfinispanRegionFactory
设置为org.hibernate.cfg.AnnotationBinder.bindClass(XClass, Map<XClass, InheritanceState>, Mappings)
,尽管我没有在我的persistence.xml中设置该属性。例如,如果调试器在HibernatePersistenceProviderAdaptor.addProviderDependencies(...)
中停止。
JBoss在public class HibernatePersistenceProviderAdaptor implements PersistenceProviderAdaptor {
private static final String DEFAULT_REGION_FACTORY = SharedInfinispanRegionFactory.class.getName();
//...
public void addProviderDependencies(ServiceRegistry registry, ServiceTarget target, ServiceBuilder<?> builder, PersistenceUnitMetadata pu) {
Properties properties = pu.getProperties();
if (Boolean.parseBoolean(properties.getProperty(AvailableSettings.USE_SECOND_LEVEL_CACHE))) {
//...
String regionFactory = properties.getProperty(AvailableSettings.CACHE_REGION_FACTORY);
if (regionFactory == null) {
regionFactory = DEFAULT_REGION_FACTORY;
properties.setProperty(AvailableSettings.CACHE_REGION_FACTORY, regionFactory);
}
//...
}
中另外设置了该属性:
SharedInfinispanRegionFactory
类domain.xml
是使用org.hibernate.cache.infinispan.InfinispanRegionFactory
中的缓存设置的类,因此,如果我使用SharedInfinispanRegionFactory
,则这些设置将不适用。但由于ClassCastException
我无法使用RegionFactory
,因此我可能需要实现自己的pointInterval
。
答案 0 :(得分:4)
您可以通过设置属性hibernate.cache.infinispan.cfg
来更改配置文件,但我认为这不是正确的解决方案,因为这意味着您创建了Infinispan 缓存管理器的新实例
当您在JBoss AS中使用2LC时,您应该获取由AS管理的缓存管理器,能够在standalone.xml
等中设置配置,因此要么不设置hibernate.cache.region.factory_class
属性或将org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory
设置为alter session set spatial_vector_acceleration=TRUE;
(遗憾的是我不确定它是如何在这样的旧版本中集成的)。
答案 1 :(得分:0)
不幸的是,为CDI(ISPN-2886)提供的修复可能不会帮助您。 JBoss AS配置很可能需要一些Infinispan缓存来进行会话复制,然后您需要为JPA二级缓存请求额外的缓存。这两个创建单独的缓存管理器并导致冲突。
根据JBoss AS 7 manual,您在使用Hibernate 4和Infinispan时都不需要指定任何其他属性(两者都默认提供)。
您可以尝试删除所有这些附加属性吗?