我有一個部分與org.infinispan.jmx.JmxDomainConflictException: Domain already registered org.infinispan Exception?有關的問題,區別在於我在JBoss 7.1.1中使用了hibernate 4.3.6。我有兩個應用程序,已大致的persistence.xml看起來就像是:發生org.infinispan.jmx.JmxDomainConflictException:在JBoss上已經使用hibernate-infinispan註冊的域
<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>
例外,當第二個應用程序的持續性單元得到由休眠加載。現在從網上解決方案經常提到增加這Infinispan的-配置:
<globalJmxStatistics allowDuplicateDomains="true" />
不過這個配置文件是休眠-的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="@[email protected]" max-entries="@[email protected]"/>
<expiration max-idle="@[email protected]" interval="@[email protected]"/>
<locking concurrency-level="@[email protected]"/>
</local-cache>
<local-cache name="local-query">
<transaction mode="NONE"/>
<eviction strategy="@[email protected]" max-entries="@[email protected]"/>
<expiration max-idle="@[email protected]" interval="@[email protected]"/>
<locking concurrency-level="@[email protected]"/>
</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.
我不知道爲什麼會出現這種錯誤,因爲hibernate-infinispan,infinispan-commons和infinispan-core位於hibernate的類路徑中。我不知道,但是這可能以某種方式相關的事實,我部署兩個不同的休眠版本的JBoss成(4.0.1和4.3.6)。沒有該屬性的配置適用於4.0.1,但不適用於4.3.6。
如果我使用org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory
我得到
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是由Hibernate 4.0.1連接到RegionFactory
。所使用的SettingsFactory
是由Hibernate 4.3.6,並嘗試將其從自己的模塊轉換爲RegionFactory
。
EDIT2:隨着調試器的幫助下,我發現,如果我使用Hibernate 4.0.1,屬性hibernate.cache.region.factory_class
設置爲org.jboss.as.jpa.hibernate4.infinispan.SharedInfinispanRegionFactory
雖然我沒有在我的persistence.xml該屬性設置。這些屬性在映射舉行,例如,如果調試器org.hibernate.cfg.AnnotationBinder.bindClass(XClass, Map<XClass, InheritanceState>, Mappings)
暫停。
這個屬性獲取的JBoss在HibernatePersistenceProviderAdaptor.addProviderDependencies(...)
還設置:
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
。
這是有道理的,但請看我編輯的問題。 –