在我的项目中,我们将 infinispan 与 Hibernate 4 结合使用作为二级缓存。这是 persistence.xml 中的条目
<jta-data-source>java:jboss/datasources/RuleEngine</jta-data-source>
<shared-cache-mode>ALL</shared-cache-mode>
<properties>
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.dialect" value="org.hibernate.dialect.DB2390Dialect"/>
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.infinispan.cachemanager" value="java:jboss/infinispan/RuleEngineCache"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.JndiInfinispanRegionFactory"/>
</properties>
我想要做的是在点击 GUI 上的按钮时清除缓存。 java代码为:
CacheManager cm = new DefaultCacheManager();
Cache<Object, Object> c = cm.getCache();
c.clear();
我将此代码添加到我的网络项目中。
但我在第一行遇到异常,说无法在模块“deployment.RuleEngineWS-ear.ear.RuleEditor-1.2.0-SNAPSHOT.war:main”中定义类 org.infinispan.io.ExposeByteArrayOutputStream来自服务模块加载器:java.lang.LinkageError:无法链接 org/infinispan/io/ExposedByteArrayOutputStream(来自服务模块加载器的模块“deployment.RuleEngineWS-ear.ear.RuleEditor-1.2.0-SNAPSHOT.war:main”)
由 java.lang.NoClassDefFoundError: org/jboss/marshalling/ByteOutput
引起
由 java.lang.ClassNotFoundException: org.jboss.marshalling.ByteOutput
缓存本身工作正常,只是在显式访问它时遇到问题。我认为如果我调用 new DefaulCacheManager() ,我将获得唯一的 CacheManager ,但随后也不推荐使用此接口(interface)。
那么如果我完全走错了路,我该如何删除我的缓存呢?
Infinispan 5.2.6
编辑:
我还尝试通过多次尝试注入(inject) CM,尤其是 @Resource(lookup="java:jboss/infinispan/RuleEngineCache")
注释。但无论我使用快速入门示例中的 EmbeddedCacheManager 还是已弃用的 CacheManager,它都不会被注入(inject)。
最佳答案
如果你想清除Hibernate的二级缓存,不管缓存提供者是什么,你应该直接调用Hibernate。调用 SessionFactory.getCache().evictAllRegions 应该可以做到这一点,而不必亲自使用 Infinispan。
关于java - 如何清除 Infinispan 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23998507/