java - 缓存不适用于 Spring 3.0、Hibernate 3.6 和 EhCache 2.6.6

标签 java spring hibernate caching ehcache

我们正在尝试让缓存在我们的应用程序中正常工作,但很难让它真正发挥作用。我们没有非常复杂的配置,至少对于应用程序的这一部分来说是这样,所以这真的很令人沮丧,我最终不得不屈服于 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 {

说实话,我以为我已经完成了。为我如此轻松地配置缓存而欢呼!您可以看到它正在工作,当缓存上线时,日志中有很多消息。太棒了!

结果发现缓存已上线,但没有缓存任何内容。我现在已经为此研究了两天,但不知道为什么我的对象没有被缓存。我尝试添加 <cache name="..."/>到我的 ehcache.xml 中,在我的 @Cache 注释上指定区域,检查缓存统计信息等。我为 net.sf.ehcacheorg.hibernate.cache 包添加了调试日志记录。我根本不明白是什么阻止了将对象保存到缓存并在那里访问它们。

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

在我的日志中,我收到了大量消息。下面是 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

我真的不知道从这里还能说些什么。完整的代码可以从我的 Bitbucket 存储库(它是 Mercurial,而不是 git)中获取,地址为 https://bitbucket.org/rherrick/nrg_config或者从 Dropbox 获取 zip https://dl.dropboxusercontent.com/u/42711610/nrg_config.zip 。您应该能够使用以下命令从 Maven 运行单元测试:

mvn clean install

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

说真的,提前非常感谢,之后也会非常感谢您对这个问题的任何帮助。

最佳答案

据我了解,仅当您在 Session 上调用 load getlist 等时,才会使用对象的二级缓存。我在您的代码中看不到此类调用。

仅当您对 QueryCriteria 对象调用 setCacheable 时,才会使用查询缓存。再说一遍,您永远不会在代码中调用该方法。

关于java - 缓存不适用于 Spring 3.0、Hibernate 3.6 和 EhCache 2.6.6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18540796/

相关文章:

JAVA 8 在启动时崩溃并出现 fatal error 日志 - Solaris 10 (sparc)

java - Spring , hibernate : Check for timestamp within expiration time

java - 与Java中枚举类型的关系

java - 使用 Spring (Java) 加载 .properties 文件

java - Spring-Maven : Unable to load Javascript file

java - DAO类和Service类用什么

mysql - Spring 启动: MySQL Duplicate key error when trying to map customers to items

java - 单独模块中使用的 Spring AOP 切面

java - 使用套接字远程连接两台非本地计算机

java - 将 Spring HATEOAS 添加到 pom.xml 失败