首页 文章

缓存不适用于Spring 3.0,Hibernate 3.6和EhCache 2.6.6

提问于
浏览
1

我们正试图让缓存在我们的应用程序中运行,并且很难让它实际运行 . 我们没有一个非常复杂的配置,至少对于应用程序的这一部分来说,所以它真的令人沮丧,我最终不得不抛弃StackOverflow社区的温柔怜悯 .

首先,目前我们仍然坚持使用Spring 3.0和Hibernate 3.6,所以使用新的Spring 3.1 @Cacheable注释和其他所有东西都不是我们的选择 .

我已将我们的堆栈版本放在主题中,我们拥有的是该堆栈的一个非常典型的配置:

  • 我们的Hibernate实体只是用@Entity定义,DAO用@Repository定义,服务用@Service定义

  • 使用@Transactional设置事务边界

  • 我在缓存中添加了ehcache-core到pom.xml并将以下属性添加到Hibernate属性映射中:

<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory</prop>

然后我将 @Cache 注释添加到我的实体类中,如下所示:

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "config")
public class Configuration extends AbstractHibernateEntity implements Serializable {

说实话,我以为我已经完成了 . 我很容易配置缓存!你可以看到它正常工作,当缓存上线时,日志中有很多消息 . 那很棒!

事实证明,缓存已经上线,没有任何缓存 . 我've now been pounding on this for two days and have no clue why my objects are not getting cached. I'已经尝试将 <cache name="..."/> 添加到我的 ehcache.xml 中,在我的 @Cache 注释上指定区域,检查缓存统计信息等 . 我已经为 net.sf.ehcacheorg.hibernate.cache 包添加了调试日志记录 . 我只是不要将这些文件保存到缓存中并在那里访问它们 .

在我们意识到我们的Web应用程序没有缓存之后,我回到依赖库并意识到它们也没有缓存(我在单元测试中添加了缓存以确保缓存没有破坏单元测试;它没有但也许这只是因为它不是缓存 . 所以我一直在研究我们的一个较低级别的依赖项,想知道如果我能弄清楚如何使它在该级别上运行,我可以将其提升到Web应用程序级别 . 这是一个伟大的理论,除了我甚至不能让它在较低层次上工作!

在我的日志中,我'm getting lots of messages. So here'是 net.sf.ehcache 的调试输出示例:

14:03:20,795  INFO                           net.sf.ehcache: 284 - CACHE HITS:  0
14:03:20,796  INFO                           net.sf.ehcache: 284 - IN-MEM HITS: 0
14:03:20,796  INFO                           net.sf.ehcache: 284 - CACHE MISS:  0
14:03:20,796  INFO                           net.sf.ehcache: 284 - IN-MEM MISS: 0
14:03:20,796  INFO                           net.sf.ehcache: 284 - EVICTIONS:   0
14:03:20,797  INFO                           net.sf.ehcache: 284 - MEM OBJ CT:  0
14:03:20,886 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration_data value: 5643835231789056
14:03:20,890 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration value: 5643835231805440
14:03:20,891 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration_data value: 5643834986045441
14:03:20,891 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration value: 5643834986045441
14:03:20,897 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration_data value: 5643835231834112
14:03:20,898 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration value: 5643835231838208
14:03:20,898 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration_data value: 5643834986078209
14:03:20,899 DEBUG bernate.regions.EhcacheGeneralDataRegion: 211 - key: xhbm_configuration value: 5643834986078209

org.hibernate.cache 日志中,我得到了很多这样的东西:

14:47:26,077 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration_data]
14:47:26,081 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration]
14:47:26,082 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration_data], timestamp: 5643845820751872
14:47:26,082 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration], timestamp: 5643845820751872
14:47:26,089 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration_data]
14:47:26,091 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration]
14:47:26,092 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration_data], timestamp: 5643845820792832
14:47:26,092 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration], timestamp: 5643845820792832
14:47:26,125 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration_data]
14:47:26,130 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Pre-invalidating space [xhbm_configuration]
14:47:26,131 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration_data], timestamp: 5643845820952576
14:47:26,132 DEBUG rg.hibernate.cache.UpdateTimestampsCache: 168 - Invalidating space [xhbm_configuration], timestamp: 5643845820952576

我真的不是https://bitbucket.org/rherrick/nrg_config,而是来自Dropbox的@924819_拉链 . 您应该能够从Maven运行单元测试:

mvn clean install

如果有人能帮助我弄清楚这里到底出了什么问题,我会非常开心!难道你不想让我欣喜若狂吗?我知道我做:)

说真的,非常感谢,并且在此之后会对此问题提供任何帮助 .

2 回答

  • 0

    据我所知,只有在 Session 上调用 load getlist 等时,才会使用对象的二级缓存 . 我无法在你的代码中看到这样的调用 .

    只有在 QueryCriteria 对象上调用 setCacheable 时,才会使用查询缓存 . 而且,您再也不会在代码中调用该方法 .

  • 1

    亚历山大,

    你走在正确的轨道上,但这只是造成这个问题的少数因素之一 . 真的有三个因素:

    • 我们的代码实际上是调用load(),get(),list()等,但它主要包含在我们的框架代码中 . 我仔细研究了一堆代码,明确强制缓存 . 这开始了一些缓存 .

    • JPA / Hibernate实体永远不应该初始化任何东西!我们有一个基类,它在实例化时设置了几个标志和时间戳 . 检索到对象时,最终会使对象看起来很脏并且需要完全用完数据库 . 这对我们的框架来说真的很重要 .

    • 设置瞬态属性时注意事务边界 . 当您进入标记@Transactional的方法时,无论您是否在该对象上调用了session.save(),都会保留对象的任何更改,as described here . 这导致对象经常无法与缓存版本匹配(尽管我似乎发生了) .

    最后,这最终难以诊断,主要是因为它不是单一因素,而是由许多不同的事物共同造成的!

相关问题