美文网首页
记一次spring与ehcache缓存问题跟踪

记一次spring与ehcache缓存问题跟踪

作者: 风吹路过的云 | 来源:发表于2018-01-31 10:41 被阅读67次

    一个java小项目,由于某种原因,要用到缓存,因为小,所以不打算去折腾memcache,redis这类大级别缓存,所以选择ehcache缓存组件与项目集成使用。

    初次使用,一开始不怎么熟悉,中间出现了一个令我困扰的问题,明明我的ehcache.xml配置里把缓存的生命周期配成不限制的,也就是说,对象可以无限长时间留在缓存中,但实际是过了2分钟的样子,缓存就消失不见了。

    现象见图:

    过2分钟左右,缓存不见了

    我的ehcache.xml配置如下:

    ehcache.xml配置,配了两个缓存

    Spring中集成ehcache的配置如下:

    Spring与ehcache的集成

    我在代码中添加缓存,获取缓存都是使用名为acache的缓存

    defaultCacheName为acache 添加缓存的方法 获取缓存的方法 在Controller里设置缓存 在Controller里获取缓存

    我天真的以为,我不是明明使用的是defaultCache吗?因为它的名字就是acache,而对象的生命周期在defaultCache里不是无限长吗?为什么过2分钟就消来了呢!!!只能打断点,跟踪问题。

    在org.springframework.cache.ehcache.EhCacheManagerFactoryBean这个类的afterPropertiesSet()方法里打个断点,看它一跑起来在缓存池中生成了多少个缓存对象。

    默认缓存的配置在对象里的呈现 再看默认缓存对象最终形式和缓存池中的缓存对象数

    看到了没,最终defaultCache的名字不是我们配置中设置的acache了,也就是说,配置中name属性设置与否,无关重要了,最终生成的defaultCache,系统帮我们把名字重置为default了,配置中的信息只是它的模板,用这个模板信息来生成一个defaultCache对象。

    到现在为止,我们在内存中能看到三个缓存对象,一个defaultCache,和池中的那两个cache对象,但它们的名字都不是acache。

    那,既然没有名为acache的缓存对象,为什么我们还能使用名为acache的缓存对象呢?再来打断点跟踪。这次我们打在EhcacheUtil类的add方法里:

    add方法中加断点

    这时,我们再来看cacheManager这个缓存管理类,看它里面的缓存池有多少缓存对象

    defaultCache没有变化,而ehcaches缓存池中多了一个名为acache的缓存对象

    这是怎么回事呢?!为什么会多一个缓存对象呢?原来这个名为acache的对象是spring帮我们创建的,它为什么帮我们创建呢?还是配置的原因,因为在配置中配了,spring就帮我们创建了。看配置:

    spring里的配置

    在org.springframework.cache.ehcache.EhCacheFactoryBean类里,打断点,看是怎么创建名为acache的缓存对象的。着先看下这个类的源码:

    看到没?这个类的构造函数里,它在这里设置了这个缓存的配置信息,将会用这些信息来产生缓存对象

    断点跟踪:

    这个类一开始就设置缓存名 新生成的缓存对象 看这个类的配置,我们就知道一开始缓存过期的原因了

    总结:

    经过,这一系列的跟踪,我们发现,生成默认缓存对象,在配置里那个name对于它来说,已经不重要,所以你会发现,百度,Google出来的关于defaultCache的配置人家是没有设置name属性的,我一开始也不知道为啥设了这个name属性导致了误解,坑啊!坑了自己!!!

    这一过程,也发现了原来spring的org.springframework.cache.ehcache.EhCacheFactoryBean这个类,它就是帮我们创建缓存的,而缓存对象的配置,是它帮忙设置的一些默认配置。

    好了,希望对你有帮助!

    相关文章

      网友评论

          本文标题:记一次spring与ehcache缓存问题跟踪

          本文链接:https://www.haomeiwen.com/subject/jockzxtx.html