休眠:无法启用二级缓存

Posted

技术标签:

【中文标题】休眠:无法启用二级缓存【英文标题】:Hibernate: Trouble enabling second level cache 【发布时间】:2011-06-28 14:08:15 【问题描述】:

我使用的是 Hibernate 3.3.4.GA。在我们的 hibernate.cfg.xml 文件中,我们指定……

    <property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</property>
    <property name="hibernate.cache.use_query_cache">true</property>
    <property name="hibernate.cache.use_second_level_cache">true</property>
    <property name="hibernate.cache.provider_configuration">classpath:ehcache.xml</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <property name="hibernate.use_sql_comments">true</property>
    <property name="hibernate.generate_statistics">true</property>
    <property name="hibernate.cache.use_structured_entries">true</property>

但是对 DB 执行测试(来自 JUnit)会导致未命中计数为零,命中计数为零,这完全令人困惑……

@Test
public void testCache() 
    final String cacheRegion = WebLead.class.getCanonicalName();
    final SecondLevelCacheStatistics settingsStatistics = sessionFactory.getStatistics().getSecondLevelCacheStatistics(cacheRegion);

    // Make first query.
    webLeadsDAO.getLeads(lead);
    System.out.println("miss count:" + settingsStatistics.getMissCount());
    System.out.println("hit count:" + settingsStatistics.getHitCount());

    // Make second query, expect this to hit cache.
    webLeadsDAO.getLeads(lead);
    System.out.println("after second query, hit count: " + settingsStatistics.getHitCount());

以下是我们用于检索结果的方法。任何想法为什么未命中计数和命中计数都为零?

@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
@Table(name="LEAD")
public WebLeads getLeads(WebLead webLead) 
    final Session session = sessionFactory.openSession();
    final Criteria crit = session.createCriteria(WebLead.class);
    crit.setCacheable(Boolean.TRUE);

    // Find webLeads matching input
    crit.add( Example.create(webLead) );
    // Make special exception for primary key since that isn't covered by Example.create
    if (webLead.getLEAD_ID() != null)  
        crit.add(Restrictions.eq("LEAD_ID", webLead.getLEAD_ID()));
       // if

    @SuppressWarnings("unchecked")
    final List<WebLead> results = crit.list();
    final WebLeads webLeads = new WebLeads();
    webLeads.addAll( results );

    session.close();
    return webLeads;

显然没有启用缓存,但我不知道为什么。 - 戴夫

【问题讨论】:

【参考方案1】:

请在此处查看我的答案以获取有效的二级缓存配置:

Second Level Cache Configuration

希望对你有帮助。

更新:

试试这个:

Statistics stats = sessionFactory.getStatistics();
stats.setStatisticsEnabled(true);
SecondLevelCacheStatistics cacheStats = stats.getSecondLevelCacheStatistics(cacheRegion);

【讨论】:

我的配置是一样的(除了你禁用统计信息),它仍然无法正常工作。为什么未命中和命中总是为零?如果我们没有命中缓存,不应该错过一些数字吗? 你不会错过缓存实体上的注解或者ehcache.xml中的xml片段吗?这个例子很适合我。我不知道可能是什么问题。 我编辑了我的回复——我有注释。我认为缓存正在工作,但统计数据包没有 - 为什么它总是会为命中和未命中返回零?如何启用 SecondLevelCacheStatistics? 请在我的回答中尝试更新部分。我认为这将启用统计数据。【参考方案2】:

您使用的是 Hibernate 3.3.4,但配置了用于 pre 3.3 Hibernatecache.provider_class

查看此链接了解更多详情:http://ehcache.org/documentation/user-guide/hibernate

【讨论】:

以上是关于休眠:无法启用二级缓存的主要内容,如果未能解决你的问题,请参考以下文章

ehCache 3.0 默认堆上条目大小(与休眠二级缓存一起使用)

清除休眠二级缓存

休眠:批处理大小?二级缓存?

共享 nHibernate 和 hibernate 二级缓存

配置 Hibernate 缓存时遇到问题 - org.hibernate.cache.NoCachingEnabledException:二级缓存未启用使用

hibernate二级缓存很慢