将ehcache.xml外部化以使用外部属性文件中的属性

时间:2012-03-23 21:07:46

标签: java spring hibernate ehcache second-level-cache

我想将属性占位符放在ehcache.xml文件中(如$ {}),以便在运行时可以从外部属性文件(.properties)替换值。 类似的东西:

ehcache.xml(在类路径中):

 <defaultCache
maxElementsInMemory="20000"
eternal="false"
timeToIdleSeconds="${default_TTI}"
timeToLiveSeconds="86400"
overflowToDisk="true"
... />

ehcache.properties(在war / classpath之外):

...
default_TTI=21600
...

目的是能够在不需要重建应用程序的情况下更改缓存配置。 Spring的PropertyPlaceHolder只适用于我不想要的ehcache的Spring bean definiton(需要将ehcache.xml保存为文件)

这里有类似的帖子,但没有任何东西让我解决。我一直在寻找一个星期!!

我使用Spring 2.5.6,Hibernate 3.2.6和Ehcache 2.4.6

任何帮助或想法都非常适合!!

非常感谢, Tripti。

4 个答案:

答案 0 :(得分:2)

作为workaroud解决方案,您可以将属性值设置为系统范围(System.setProperty(...))。 EhCahe在解析配置文件时使用这些属性来解析占位符。

答案 1 :(得分:1)

我终于得到了解决方案!感谢braveterry指出我朝这个方向。 我在上下文启动时使用了这个:

Inputstream = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath()); 
cacheManager = CacheManager.create(stream);

与hibernate配置结合:

<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</prop>

这将从上下文类路径之外的ehcache.xml文件创建单独的CacheManager。我之前做过同样的事情,但是在使用类路径中的默认ehcache.xml之前意外创建了另一个CacheManager。

谢谢, Tripti。

答案 2 :(得分:1)

svaor,我遵循你的意思,我定义了这样一个bean:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetClass" value="java.lang.System" />
        <property name="targetMethod" value="setProperty" />
        <property name="arguments">
            <list>
                <value>system.project_name</value>
                <value>${system.project_name}</value>
            </list>
        </property>
    </bean>

system.project_name在system.properties文件中定义,该文件位于类路径

我还在classpath中创建了一个ehcache.xml,在ehcache.xml中有这样的代码:

<diskStore path="${java.io.tmpdir}/${system.project_name}/cache" />

但是当我部署我的项目时,我发现它不能使用system.properties中的system.project_name定义,为什么?

答案 3 :(得分:0)

如果您只想在启动时read the config in from disk,可以在EHCache 2.5中执行以下操作:

InputStream fis = 
    new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());
try 
{
  CacheManager manager = new CacheManager(fis);
} 
finally 
{
  fis.close();
}