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", 用法 = CacheConcurrencyStrategy.READ_WRITE)
公共类 Kierunek 实现 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=""/>

并且删除了那个错误的前缀 big thx ruslan!

4

3 回答 3

9

恕我直言,您将获得为您的班级生成的区域名称。这个生成的名称“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" />
于 2009-04-19T15:24:27.163 回答
5

Hibernate 根据 appname 或属性 hibernate.cache.region_prefix 的值向缓存名称添加前缀

如果您将此属性设置为“”(空字符串),那么您的区域名称与休眠配置中的名称完全相同。

于 2011-11-03T17:10:00.840 回答
0

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

有关如何配置 EHCache,请参阅http://ehcache.sourceforge.net/documentation/configuration.html 。

于 2009-04-19T11:27:08.547 回答