【问题标题】:Hibernate 2nd level cache休眠二级缓存
【发布时间】:2010-10-20 09:28:07
【问题描述】:

您好,我在使用休眠二级缓存时遇到了一些问题。 作为缓存提供者,我使用 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)
公共类 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!

【问题讨论】:

  • 你应该完整地拼出单词“level”而不是“lvl”。它更具可读性和可搜索性。
  • 你是对的。我写这篇文章很沮丧,所以我没有考虑过^^谢谢

标签: java hibernate annotations ehcache


【解决方案1】:

恕我直言,您获得了为您的班级生成的区域名称。这个生成的名称“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" />

【讨论】:

  • 是的,我确实得到了生成的区域名称(现在我知道它是区域,在我读过的文章中它只是被称为缓存,所以我很困惑..),这就是我的初衷。想知道为什么 Hibernate 会生成错误的区域名称。再一次,如果你有默认条目,你不需要为每个实体指定区域(如果你同意的话)。无论如何,我很感谢您的回答。它解决了我的问题。谢谢! ^^
  • 欢迎。我已经检查了文档。他们说默认区域名称是完全限定的类名称。这是文档中的一个大错误,他们应该尽快修复它,因为无论如何都不清楚。
  • 它适用于 2 个部署网络,现在我得到:警告:找不到名为 [persistence.unit:unitName=pz2EAR.ear/pz2EJB.jar#pz2EJB.Kierunek] 的缓存的特定 ehcache 配置;使用默认值。 19:52:57,313 错误 [AbstractKernelController] 安装到开始时出错:name=persistence.unit:unitName=pz2EAR.ear/pz2EJB.jar#pz2EJB state=Create java.lang.IllegalArgumentException:缓存名称不能包含“/”字符。它看到注释中设置的区域名称,但添加了备用前缀..
  • 你使用的是什么休眠版本?也许您需要 ehcache org.hibernate.cache.EhCacheProvider 的下一个缓存提供程序类。我们使用了下一个休眠属性 hibernate.cache.region_prefix,例如 试试这个。希望它会有所帮助。
  • 解决了这个问题。非常感谢^^
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    请参阅http://ehcache.sourceforge.net/documentation/configuration.html 了解如何配置 EHCache。

    【讨论】:

    • 我有正确的 ehcache 配置(如果你定义了“默认”缓存,你不需要在 ehcache.xml 中配置每个实体)。问题是为什么hibernate会生成那个奇怪的缓存名称?它应该是 pl.bdsdev.seps.encje.Kierunek 并且是 persistence.unit:unitName=pz2EAR.ear/pz2EJB.jar#pz2EJB.pl.bdsdev.seps.encje.Kierunek
    猜你喜欢
    • 2017-07-05
    • 2011-07-08
    • 1970-01-01
    • 2019-04-02
    • 2010-10-29
    • 2023-03-03
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多