使用EHCache需要注意的几个问题(转)
最近做一个小项目,需要对一批数据进行缓存,且要求持久化到磁盘。使用ehcache非常简单和直观,一般来说只需要配置ehcache.xml文件,接着直接使用@Cacheable, @Cacheput, @CacheEvict即可。
三个注解的意思也很简单,这里就不说了。
ehchche.xml的配置非常简单和直观:
<!--name:缓存名称-->
<!--maxElementsInMemory:缓存最大个数-->
<!--eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期-->
<!--timeToIdleSeconds:置对象在失效前的允许闲置时间(单位:秒),仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大-->
<!--timeToLiveSeconds:缓存数据的生存时间(TTL),也就是一个元素从构建到消亡的最大时间间隔值,这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间-->
<!--overflowToDisk:内存不足时,是否启用磁盘缓存-->
<!--maxElementsOnDisk:设置成0 表示硬盘中最大缓存对象数无限大-->
<!--diskPersistent:设置成true表示缓存虚拟机重启期数据磁盘存储是否在虚拟机重启后持续存在-->
<cache name="appdsCache"
maxElementsInMemory="0"
eternal="true"
maxElementsOnDisk="10000000"
overflowToDisk="true"
diskPersistent="true"
memoryStoreEvictionPolicy="LRU">
<!--<persistence strategy="localRestartable" synchronousWrites="false"/>-->
</cache>
但是在使用过程中遇到了两个小问题,下面简单的做个记录。
1. 在类中写了一个带有缓存注解的方法,然后在一个普通方法中调用了这个缓存函数,则缓存功能不再生效。如下:
@EnableCaching
class A implements IA{
public String funA(){
return funB();
} @Cacheable
public String funB(){
...
}
}
其实这和Spring的对象注入机制有关,例如,当外部通过@Autowired注解得到一个A类的对象时,其实得到的是一个spring包装过的代理对象。
当调用a.funB()时,实际调用的是spring的proxy对象中的funB()方法,该方法内置了cache机制,在cache检查后就会调用实际的a对象中的funA方法。
同理当调用a.funA()时,也是先调用spring的proxy对象中的funA()方法,经过检查和资源分配等步骤后,会调用实际的a对象中的funA()方法,但是当在实际的A类对象中再调用funB()时,不会触发cache机制,因为此时调用的不是SpringCacheProxy对象,而是一个实际的A类对象,所以不会触发cache机制。
如果深入研究Spring完成注入和AOP编程实现的原理,可以发现动态代理是很重要的一个技术。目前Spring的动态代理主要是通过CGLib来实现的。
那么这个问题如何解决呢?有两种思路:
(1) 拆分为两个类来实现。即将funA()和funB()写在两个类中。
(2) 在类中注入自身实例。如下:
@EnableCaching
@Service(value="a")
class A implements IA{ @Resource(name="a")
private IA a; public String funA(){
return a.funB();
} @Cacheable
public String funB(){
...
} }
第二种方法亲测有效~~
不管怎样,都要记住如下原则:同一个类中的注解方法互相调用时,注解机制可能是无效的。
2. (在idea中点击红色按钮关闭程序时) 持久化到磁盘的数据无法恢复。
原因如下:ehcache和其它缓存类似,需要flush或shutdown后才会持久化到磁盘。
会生成.data 的数据文件和 .index 的索引文件,方便重启恢复。
ehcache恢复数据是根据.index索引文件来进行数据恢复的。
当程序再次启动的时候,ehcache的一个方法会将.data文件和.index文件的修改时间进行比较,如果不符合直接将.index文件删除。
一般来说,以下两种情况,会自动调用shutdown()函数:
(1) 调用System.exit(),或最后一个非守护线程退出。
(2) 虚拟机停止运行。例如在命令行中执行CTRL+C,这会导致kill -SIGTERM pid 或kill -15 pid。
而在idea中点击红色按钮时,属于非正常关闭,导致shutdown()未能执行,猜测执行的是类似kill-9直接杀死进程的方法,而不是kill-15比较安全的关闭。
官网建议是最好是在程序关闭之前显式地调用shutdown()函数,但是实际实践中,就算是显式调用了shutdown(),要是在程序运行到一半时点击idea的红色关闭按钮,缓存还是会失效。。
在我看来最安全的方法就是把程序打成jar包运行,用CTRL+C在命令行终止程序,就算此时程序并没有执行完,shutdown()也会执行。
使用EHCache需要注意的几个问题(转)的更多相关文章
- [原创]mybatis中整合ehcache缓存框架的使用
mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...
- springmvc 多数据源 SSM java redis shiro ehcache 头像裁剪
获取下载地址 QQ 313596790 A 调用摄像头拍照,自定义裁剪编辑头像 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单; 技术:31359679 ...
- 网站缓存技术总结( ehcache、memcache、redis对比)
网站技术高速发展的今天,缓存技术已经成为大型网站的一个关键技术,缓存设计好坏直接关系的一个网站访问的速度,以及购置服务器的数量,甚至影响到用户的体验. 网站缓存按照存放的地点不同,可以分为客户端缓存. ...
- 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(前言)
一直希望能够搭建一个完整的,基础Web框架,方便日后接一些外快的时候,能够省时省力,终于花了一周的时间,把这个东西搞定了.特此写下此博客,一来是纪念,二来是希望能够为别人提供方便.顺带说一下,恩,组合 ...
- 转载:Spring+EhCache缓存实例
转载来自:http://www.cnblogs.com/mxmbk/articles/5162813.html 一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干 ...
- Hibernate+EhCache配置二级缓存
步骤: 第一步:加入ehcache.jar 第二步: 在src目录下新建一个文件,名为:ehcache.xml 第三步:在hibernate配置文件的<session-factory>下配 ...
- 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(五)
SpringSecurity(2) 好久没有写了,之前只写了一半,我是一边开发一边写Blog一边上班,所以真心没有那么多时间来维护Blog,项目已经开发到编写逻辑及页面部分了,框架基本上已经搭建好不会 ...
- (转)springMVC+mybatis+ehcache详细配置
一. Mybatis+Ehcache配置 为了提高MyBatis的性能,有时候我们需要加入缓存支持,目前用的比较多的缓存莫过于ehcache缓存了,ehcache性能强大,而且位各种应用都提供了解决方 ...
- ehcache注解全面解析---打酱油的日子
通过ehcache以编程方式使用缓存: 跟上面的方式相同,但是缓存通过ehcache去管理,当然比使用map有N多种好处,比如缓存太大了快达到上限之后,将哪一部分缓存清除出去.这种方式完全是通过代码的 ...
- spring mvc + ehcache 利用注解实现缓存功能
我的spring是3.1的,因为项目需求,需要在查询时候加上缓存,小白一个,完全没有用过缓存(ehcache),摸索了一天终于会了一点通过注解来使用ehcache进行缓存,立刻给记录下来. 首先 我的 ...
随机推荐
- 大型服装集团BI决策系统的分析主题模块
一般BI商业智能解决方案都包含财务.销售.客户等分析模块,本文分享的是某大型服装集团通过帆软FineBI建设的BI决策系统.该决策系统主要针对财务.资金.采购.生产.库存.物流.销售.渠道.产品.客户 ...
- inittab文件剖析[CentOS 5.X](第二版)
inittab文件剖析[CentOS 5.X] grep -v "^#" /etc/inittab | more #过滤掉以#开头的行 inittab文件格式 id:runleve ...
- 粒子系统属性Life,发射速率和总数的关系
提示,粒子系统的life,发射速率以及总粒子数是相互影响的. 如果你要发射器射出粒子流然后停顿一会,你将简单的必须确保lifetime和发射速率相匹配以至于在发射出的粒子达到粒子总数之前一些粒子是活跃 ...
- Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听
Android实训案例(六)--四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听 Android中四大组件的使用时重中之重,我这个阶段也不奢望能把他 ...
- cocos2d 从v1.x升级到v2.x需要注意的几个地方
首先v1.x一些CCNode定位函数实现的有问题,导致返回的CCPoint的x坐标不正确(超出320后无变化),怀疑是其对屏幕旋转判断的不正确;而且这种现象在iOS 7.1之前的模拟器中运行都正常,在 ...
- 学习C++模板,类模板
当我们使用向量时,会经常使用形如:vector<int> a的式子.这个表达式就是一个类模板实例化的例子,vector是一个类模板,我们给他传递模板参数(见<>里),然后创建一 ...
- Android Data Binding实战(一)
在今年Google I/O大会上,Google推出Design Library库的同时也推出了Android Data Binding,那么什么是Data Binding?其名曰数据绑定,使用它我们可 ...
- HBase Master 启动
–>首先初始化HMaster –>创建一个rpcServer,其中并启动 –>启动一个Listener线程,功能是监听client的请求,将请求放入nio请求队列,逻辑如下: –&g ...
- nasm预处理器(2)
多行宏 %macro: %macro foo 2 push rax push rbx mov rax,%1 mov rbx,%2 pop rbx pop rax %endmacro 宏名称后的数字代表 ...
- "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: no freetype in java.library.path
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: no freetype in java ...