2014-06-05 31 views
3

我有一个java web应用程序部署在Jboss 6.1.0上,它使用了infinispan 5.2.6.Final。 我想这个指南Infinispan - set per entity expiration.lifespan

http://infinispan.org/docs/5.2.x/user_guide/user_guide.html#_advanced_configuration_2

我的实体Bean com.myenterprise.myproject.dal.ejb.entity.RefStatus以下设置每个实体的具体expiration.lifespan

该指南规定如下:

您也可以在覆盖逐出/到期设置每个实体/集合 类型的基础上以这样的方式使被覆盖的设置只afftect特定 实体(即COM。 acme.Person)或集合类型(即com.acme.Person.addresses)。 例如:

<property name="hibernate.cache.infinispan.com.acme.Person.expiration.lifespan" value= "65000"/> 

所以,我已经添加了以下元素,以我的persistence.xml,以减少寿命至10毫秒用于测试目的,以微调稍后:

<property name="hibernate.cache.infinispan.com.myenterprise.myproject.dal.ejb.entity.RefStatus.expiration.lifespan" value= "10"/> 

该设置不会产生任何效果,寿命仍然是默认值。

你知道我必须如何设置persistence.xml来成功覆盖默认的过期寿命吗? 设置

<property name="hibernate.cache.infinispan.entity.expiration.lifespan" value= "10"/> 

它的工作原理,但它会影响所有的实体缓存,这是不是我想要的。

下面是我的application.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> 
    <persistence-unit name="myProject_dal_PU" transaction-type="JTA"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:jboss/datasources/myProject-DataSource</jta-data-source> 
     <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> 
     <properties> 
      <property name="hibernate.archive.autodetection" value="class" /> 
      <property name="hibernate.bytecode.use_reflection_optimizer" value="true" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" /> 
      <property name="hibernate.show_sql" value="false" /> 
      <property name="hibernate.format_sql" value="false" /> 

      <property name="hibernate.cache.use_second_level_cache" value="true" /> 
      <property name="hibernate.cache.use_minimal_puts" value="true" /> 
      <property name="hibernate.cache.use_query_cache" value="true" /> 
      <property name="hibernate.cache.infinispan.com.myenterprise.myproject.dal.ejb.entity.RefStatus.expiration.lifespan" value= "10"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

谢谢。

回答

4

如果您正在应用程序服务器内运行,除了实体名称之外,您还必须提供部署名称和单位。因此,所有这些过期属性需要与预先考虑:hibernate.cache.infinispan.<warname>.<unitname>.<FQN of entity>...

在你的情况,我不知道你部署的名称,但与单位和FQN你提到,像:

hibernate.cache.infinispan.<warname>.myProject_dal_PU.com.myenterprise.myproject.dal.ejb.entity.RefStatus.expiration.lifespan

+0

顺便说一句,我正在更新文档,添加了这个缺失的信息。 –

+0

不错的文章/解释 –

+0

@GalderZamarreño它没有与您的答案一起工作,请找到我做的配置更改。在我的情况下人员实体停留在demo.war - > my-entity.jar - > com.demo.model.Person.class ...添加以下属性到我的persistence.xml 对于测试pupose我使用jconsole - >统计 - >条目。一段时间后由于闲置实时存储的实体正在被驱逐,但我们希望保留在高速缓存中而没有寿命和超时(基本上没有到期)。 – prem

1

用了几个小时才找到正确的配置。显然,这是如下:

Hibernate的属性应该是按以下格式:

hibernate.cache.infinispan.<prefix>.<full-class-name>.<property-name>其中:

<prefix> - 默认情况下它是您在排序JNDI名称中看到的名称。在Wildfly的情况下,它是ear-name.ear/ejb-jar-name.jar#persistence-unit-name 然而,它可以通过hibernate.cache.region_prefix属性来控制。将region_prefix设置为“”并忽略前缀。

<property-name> - 字符串,因为它出现在org.hibernate.cache.infinispan.InfinispanRegionFactory类和正式的Infinispan文档中。

总之,官方Infinispan documentation是正确的,只有当你设置hibernate.cache.region_prefix为“”