我正在尝试将Ehcache配置为hibernate二级缓存,到目前为止,我发现的所有示例都指示您在类路径中创建一个ehcache.xml文件,如:
<ehcache updateCheck="false">
<diskStore path="java.io.tmpdir" />
<defaultCache maxElementsInMemory="10000" eternal="false"
statistics="true" timeToIdleSeconds="120" timeToLiveSeconds="120"
overflowToDisk="true" diskPersistent="false"
diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" />
<cache name="com.yourcompany.CachedEntity" eternal="true" maxElementsInMemory="1000" />
</ehcache>
然后按如下方式配置Hibernate:
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory"/>
<property name="net.sf.ehcache.configurationResourceName" value="/ehcache.xml" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.cache.use_second_level_cache" value="true" />
在我的工作场所,我们鼓励尽可能使用java配置并避免使用XML配置文件。我很感激有关如何实现这一目标的任何指示。
答案 0 :(得分:1)
using ehcache in spring 4 without xml提到的stackoverflow问题learningJava显示了如何在java中配置ehcache CacheManager
,但是你仍然需要一种方法来告诉hibernate它应该使用你配置的java {{1} }}
可能的方法是通过CacheManager
属性配置自定义ehcache区域工厂。如果你看一下SingletonEhCacheRegionFactory的实现,你会发现在自己的hibernate.cache.region.factory_class
中进行交换非常容易。
我怀疑java配置和缓存的xml配置之间的映射非常简单,但是如果ehcache在解析xml配置时在幕后执行一些“神奇的东西”,那么让你的java配置正确的工作可能有点棘手。
答案 1 :(得分:1)
我也找不到这个问题的示例代码所以我认为我会分享我的解决方案。 @Pieter的回答让我走上了正确的轨道,您需要实现自己的EhCacheRegionFactory类,以便您可以提供自定义的Java配置对象。看来库存库只支持xml。这是我的解决方案的样子:
public class CustomEhCacheRegionFactory extends EhCacheRegionFactory{
private static final EhCacheMessageLogger LOG = Logger.getMessageLogger(
EhCacheMessageLogger.class,
CustomCacheRegionFactory.class.getName()
);
@Override
public void start(Settings settings, Properties properties) throws CacheException {
this.settings = settings;
if ( manager != null ) {
LOG.attemptToRestartAlreadyStartedEhCacheProvider();
return;
}
try {
final Configuration configuration = new Configuration();
configuration.addCache( getEntityCacheConfiguration() );
manager = new CacheManager( configuration );
mbeanRegistrationHelper.registerMBean( manager, properties );
}
catch (net.sf.ehcache.CacheException e) {
//handle
}
}
/**
* Create the basic second level cache configuration
* @return
*/
private CacheConfiguration getEntityCacheConfiguration()
{
CacheConfiguration config = new CacheConfiguration("entity", 50000);
config.setTimeToIdleSeconds(86400);
config.setTimeToLiveSeconds(86400);
return config;
}
}