2009-04-19 142 views
8

您好我遇到了休眠二级缓存的一些问题。 作为缓存提供者,我使用ehcache。休眠二级缓存

从persistence.xml中

<property name="hibernate.cache.use_second_level_cache" value="true"/> 
<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" /> 
<property name="hibernate.cache.provider_configuration_file_resource_path" value="/ehcache.xml" /> 

我配置使用注解,所以我的实体配置的部分:

@Cache(region = "Kierunek", usage = CacheConcurrencyStrategy.READ_WRITE) 
public class Kierunek implements Serializable {

进口的注解是: import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy;

我ehcache.xml中

<diskStore path="java.io.tmpdir" /> 

<defaultCache maxElementsInMemory="10000" eternal="false" 
    timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" 
    diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000" 
    diskPersistent="false" diskExpiryThreadIntervalSeconds="120" 
    memoryStoreEvictionPolicy="LRU" /> 

<cache name="Kierunek" maxElementsInMemory="1000" 
    eternal="true" overflowToDisk="false" memoryStoreEvictionPolicy="LRU" /> 

而且任何人都知道为什么我得到下面的错误?

WARNING: Could not find a specific ehcache configuration for cache named [persistence.unit:unitName=pz2EAR.ear/pz2EJB.jar#pz2EJB.Kierunek]; using defaults. 
19:52:57,313 ERROR [AbstractKernelController] Error installing to Start: name=persistence.unit:unitName=pz2EAR.ear/pz2EJB.jar#pz2EJB state=Create 
java.lang.IllegalArgumentException: Cache name cannot contain '/' characters. 

解决办法是增加另一个属性到persistence.xml中

<property name="hibernate.cache.region_prefix" value=""/> 

,并且删除了错误的前缀大THX鲁斯兰!

+1

你应该完全拼出单词“level”而不是“lvl”。它更具可读性和可读性。 – 2009-04-19 19:29:33

+1

你说得对。我正在写这篇文章,感觉很沮丧,所以我没有想过这件事^^谢谢 – Dogrizz 2009-04-19 20:38:59

回答

8

恕我直言,你会得到你的班级生成的区域名称。这生成名称“persistence.unit:unitName = pz2EAR.ear/pz2EJB.jar#pz2EJB.pl.bdsdev.seps.encje.Kierunek”。而且它没有在你的ehcache.xml配置中定义。它也在寻找预定义的名称,所以它不能使用默认区域。

作为解决这个问题,你可以使用@Cache注释属性来预先设置一些区域名称的选择,像

@Cache(region = 'Kierunek', usage = CacheConcurrencyStrategy.READ_WRITE) 
public class Kierunek implements Serializable { 
    // .... 
} 

而且在ehcache.xml中

<cache name="Kierunek" 
     maxElementsInMemory="1000" 
     eternal="true" 
     overflowToDisk="false" 
     memoryStoreEvictionPolicy="LRU" /> 
0

的EHCache需要告诉它如何缓存在应用程序中的对象(直播时间,缓存类型,缓存大小,缓存行为等)的配置。对于您尝试缓存的每个类,它都会尝试找到适当的缓存配置,并在上面的错误中输出错误。

http://ehcache.sourceforge.net/documentation/configuration.html关于如何配置的EHCache。

+0

我有适当的ehcache配置(如果你有“默认”缓存定义,你不需要在ehcache.xml中配置每个实体)。 问题是为什么hibernate生成奇怪的缓存名称? 应当pl.bdsdev.seps.encje.Kierunek并且persistence.unit:的unitName = pz2EAR.ear/pz2EJB.jar#pz2EJB.pl.bdsdev.seps.encje。Kierunek – Dogrizz 2009-04-19 12:27:25

5

休眠添加前缀缓存名基于应用程序的名字或财产hibernate.cache.region_prefix

的价值。如果你设置该属性为“”(空字符串),那么你已经命名的区域酷似名称在休眠配置。