最近做一个小项目,需要对一批数据进行缓存,且要求持久化到磁盘。使用ehcache非常简单和直观,一般来说只需要配置ehcache.xml文件,接着直接使用@Cacheable, @Cacheput, @CacheEvict即可。

三个注解的意思也很简单,这里就不说了。

 

ehchche.xml的配置非常简单和直观:

 1 <!--name:缓存名称-->
 2     <!--maxElementsInMemory:缓存最大个数-->
 3     <!--eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期-->
 4     <!--timeToIdleSeconds:置对象在失效前的允许闲置时间(单位:秒),仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大-->
 5     <!--timeToLiveSeconds:缓存数据的生存时间(TTL),也就是一个元素从构建到消亡的最大时间间隔值,这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间-->
 6     <!--overflowToDisk:内存不足时,是否启用磁盘缓存-->
 7     <!--maxElementsOnDisk:设置成0 表示硬盘中最大缓存对象数无限大-->
 8     <!--diskPersistent:设置成true表示缓存虚拟机重启期数据磁盘存储是否在虚拟机重启后持续存在-->
 9     <cache name="appdsCache"
10            maxElementsInMemory="0"
11            eternal="true"
12            maxElementsOnDisk="10000000"
13            overflowToDisk="true"
14            diskPersistent="true"
15            memoryStoreEvictionPolicy="LRU">
16         <!--<persistence strategy="localRestartable" synchronousWrites="false"/>-->
17     </cache>

但是在使用过程中遇到了两个小问题,下面简单的做个记录。

1. 在类中写了一个带有缓存注解的方法,然后在一个普通方法中调用了这个缓存函数,则缓存功能不再生效。如下:

@EnableCaching
class A implements IA{public String funA(){return funB();      }  @Cacheablepublic 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();      }  @Cacheablepublic 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()也会执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/278845.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/278845.shtml
英文地址,请注明出处:http://en.pswp.cn/news/278845.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL的常见存储引擎介绍与参数设置调优(转载)

原文地址&#xff1a;http://www.cnblogs.com/demon89/p/8490229.htmlMySQL常用存储引擎之MyISAM特性&#xff1a;1、并发性与锁级别2、表损坏修复check table tablenamerepair table tablename3、MyISAM表支持的索引类型①、全文索引②、前缀索引4、MyISAM表支持数据压缩myisa…

计算机网络udp实验时间戳请求报文与应答报文的表格填写,自考计算机网络管理历年(2007.1-2013.1)试题及答案(标有页码)...

33.假设某RMON MONTIOR矩阵组的matrixSDTable和matrixDSTable的内容如下表1和表2所示。表1. matrixSDTbalematirxSDSourceAddress matrixSDDestAddress matrixSDPkts m,atrixSDOctests matrixSDError 008000AB1258 00A0C5BA9C02 1274 1697133 11 ……………表2. matrixDSTablem…

如何在Twitter上阻止令人讨厌的“今日热门新闻@yourname”垃圾邮件

Lately I’ve noticed an annoying trend on Twitter—people constantly spamming your replies feed with these posts saying that you were the top story on somebody’s feed. Very irritating, but here’s how to get rid of it. 最近&#xff0c;我注意到Twitter上有一…

蕾丝的选购和保养秘诀

维秘柔情内裤性感/舒适/健康/透气 复制代码 维秘柔情不仅仅是商品质材料和考究的设计&#xff0c;更是一个坚守生活美学的理念&#xff0c;总有一款维秘柔情告诉你的身体密码。从此之前所用&#xff0c;皆为将就。从此之前所见&#xff0c;皆为平常。 在内裤不再是遮掩的这个时…

Python -bs4介绍

https://cuiqingcai.com/1319.html Python -BS4详细介绍Python 在处理html方面有很多的优势,一般情况下是要先学习正则表达式的.在应用过程中有很多模块是非常方便的,先尝试使用BeautifulSoup和Urllib进行网页的处理,仅供学习.首先列举所需要导入的模块:from bs4 import Beauti…

广东工业大学计算机学院书记,计算机学院召开2018年工作总结大会

单 位&#xff1a;计算机学院2019年1月8日上午&#xff0c;计算机学院在工学一号馆216会议室召开了学年工作总结大会。会议由学院陈平华副院长主持。会上&#xff0c;郭维喜书记对过去一学年学院各项工作给予了肯定&#xff0c;并从党的建设、意识形态工作、思想宣传工作、师德…

Numpy的常用方法

NumPy是用Python进行科学计算的基本软件包。它包含以下内容&#xff1a; 一个强大的N维数组对象复杂的&#xff08;广播&#xff09;功能用于集成C / C 和Fortran代码的工具有用的线性代数&#xff0c;傅里叶变换和随机数能力除了明显的科学用途外&#xff0c;NumPy还可以用作通…

vista任务栏透明_增加Windows Vista任务栏预览大小的赏金(付费!)

vista任务栏透明Ever since Windows Vista came out, I’ve been trying to figure out how to increase the size of the tiny Windows Vista taskbar preview windows. I’ve scoured the registry, used process monitor to try and find hidden registry keys, and looked …

Netty原理分析

Netty是一个高性能、异步事件驱动的NIO框架&#xff0c;它提供了对TCP、UDP和文件传输的支持&#xff0c;作为一个异步NIO框架&#xff0c;Netty的所有IO操作都是异步非阻塞的&#xff0c;通过Future-Listener机制&#xff0c;用户可以方便的主动获取或者通过通知机制获得IO操作…

福州大学计算机学院董晨老师,福州大学代表队高分斩获第三届福建省高校网络空间安全大赛冠军...

新闻中心讯/10月27日&#xff0c;由福建省教育厅、福建省网络与信息安全协调小组办公室主办的“百越杯”第三届福建省高校网络空间安全大赛在福州圆满落幕&#xff0c;福州大学三支代表队揽获本届大赛的冠军暨特等奖、二等奖和三等奖。本次省赛福州大学派出的代表队由数学与计算…

用uid分库,uname上的查询怎么办?

2019独角兽企业重金招聘Python工程师标准>>> 【缘起】 用户中心是几乎每一个公司必备的基础服务&#xff0c;用户注册、登录、信息查询与修改都离不开用户中心。 当数据量越来越大时&#xff0c;需要多用户中心进行水平切分。最常见的水平切分方式&#xff0c;按照u…

python 新闻摘要_每日新闻摘要:运营商承诺他们不再出售您的位置…

python 新闻摘要Last year it was discovered that Verizon, Sprint, AT&T, and T-Mobile were all selling your real-time location data to third-party companies. They offered no oversight of what the companies did with the data whatsoever, and if that’s not…

Jquery中的this是什么类型

var city $("#city"); //这个city是dom还是jq if(city instanceof jQuery) alert(11); else alert(this.tagName); 总结&#xff1a; 1 如果是一个节点的某个事件…

计算机复试比重低的学校,又有985院校发布调剂信息,这个34所降低复试比重!...

原标题&#xff1a;又有985院校发布调剂信息&#xff0c;这个34所降低复试比重&#xff01;01985院校调剂01.清华大学昨天&#xff0c;清华大学发布一则调剂信息&#xff1a;临床医学交叉人才培养项目接受调剂。接收调剂专业如下&#xff1a;据其官网介绍&#xff0c;该项目为推…

Silverlight 解谜游戏 之四 粒子特效

前几篇一直在Blend中工作没体现出开发者的作用&#xff0c;本篇将为订书器&#xff08;Stapler&#xff09;添加自定义粒子效果&#xff0c;当订书器被点击时产生更好的视觉效果。其中将使用到nerdplusart 的Silverlight Particle Generator 粒子特效工具。 在结束本章内容后&a…

CS229 1 .线性回归与特征归一化(feature scaling)

线性回归是一种回归分析技术&#xff0c;回归分析本质上就是一个函数估计的问题&#xff08;函数估计包括参数估计和非参数估计&#xff09;&#xff0c;就是找出因变量和自变量之间的因果关系。回归分析的因变量是应该是连续变量&#xff0c;若因变量为离散变量&#xff0c;则…

注册表被黑客篡改 怎样修复_使用快速注册表黑客设置Office 2007配色方案

注册表被黑客篡改 怎样修复We’ve written previously about how to set the Office 2007 color scheme away from that awful default blue, but you can also set it with a quick registry hack or even via group policy on your network, so we’ll cover that here. 前面…

共享计算机后无法访问磁盘,win10电脑共享硬盘无法访问如何解决

很多用户为了方便文件的传输和访问&#xff0c;就会在局域网中开启硬盘共享&#xff0c;正常是可以通过网络打开访问该用户计算机的磁盘从而读取数据文件&#xff0c;可是有win10系统用户却发现共享硬盘无法访问&#xff0c;武大直接通过网络打开对方的磁盘&#xff0c;该如何处…

mikadonic-iptables学习笔记

firewall图像化配置[rootdesktop0 ~]# firewall-config iptabes -Fiptabes -Xiptabes -Z先设置默认规则&#xff08;最后防线&#xff09;[rootdesktop0 ~]# iptables -P INPUT DROP&&iptables -P OUTPUT DROP&&iptables -P FORWARD DROP iptables -A&#xf…

如何组合救援磁盘以创建最终Windows修复磁盘

We’ve covered loads of different anti-virus, Linux, and other boot disks that help you repair or recover your system, but why limit yourself to just one? Here’s how to combine your favorite repair disks together to create the ultimate repair toolkit for…