spring整合ehcache注解实现查询缓存,并实现实时缓存更新或删除
2017-02-13 08:40
701 查看
注:引入jar
第一步:首先配置ehcache.xml
第二步:在spring.xml的配置文件中引入schema, xmlns:aop=”http://www.springframework.org/schema/aop” 和http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.2.xsd
缓存的配置:
OK!缓存的相关配置已经完成。下面开始编写测试程序。这里需要连接数据库,我就不写了。这里为了方便就随便找了之前写过的model,这个model就是AOP注解实现日志管理的实体,为了偷懒就直接用了,希望你们不要误解,没有特殊意义的
第三步:编写model,这里需要注意,要实现缓存的实体必须要序列化 private static final long serialVersionUID = -6579533328390250520L; 关于序列化的生成这里就不介绍了,大家可以百度看看。
第四步:编写dao,service
第五步:编写serviceImpl并添加缓存注解。这里缓存注解的参数不介绍了,不懂得看我上一篇博客,我这里先把需要的注解都写上了,一会一个一个介绍。
第六步:编写controller,即我们的测试。
我们先测试查询的缓存,即serviceImpl中的 findSystemLog(String id) 方法,我们访问testLog.do,第一次运行如下图,注意控制台中的heap和 disk
![](http://incdn1.b0.upaiyun.com/2017/02/e9fa3a3118814be6d656a76311dfeb48-1024x235.png)
再一次访问testLog.do,运行你会发现没有访问数据库,如图:
![](http://incdn1.b0.upaiyun.com/2017/02/814a3f1b5c1c83131e8d7863fbbe0d2f-1024x138.png)
到此查询的缓存我们实现了,但是关于缓存的处理我们并没有做完,我们应该在深入思考下,在上面查询的缓存生命周期内,我们对刚才查询的表进行了增删改操作,这时我们再访问该查询方法,你会发现我们的数据并没有改变,还是增删改操作之前的数据(因为缓存的生命还在),这里是不是问题呢?此时我们需要对查询的缓存进行更新或删除。
下面我们看serviceImpl中的insert方法和count()方法,count的方法是统计表中的数据总记录,insert方法是对该表进行新增一条记录,insert的缓存注解用的是@CacheEvict(value=”myCache”,key=”0″,beforeInvocation=true),这里清除的是指定缓存,也就是count方法中@Cacheable(value=”myCache”,key=”0″)的,(serviceImpl中注释的@CacheEvict(value=”myCache”,allEntries=true,beforeInvocation=true)是清除所有的缓存,这里我就不演示了,道理是一样的)
这里我提供一个测试pageEhcache.jsp页面,
![](http://incdn1.b0.upaiyun.com/2017/02/af9e404ce1203dcaa87f2bebf9dee44d-1024x236.png)
我们先访问test1.do,看下表中的记录数并注意控制台变化
页面显示如下,注意总数是67,
![](http://incdn1.b0.upaiyun.com/2017/02/102035856a32c3bc5b1b8e6132343b2d.png)
再一次访问test1.do,没有访问数据库,说明count()方法的缓存生效了,
![](http://incdn1.b0.upaiyun.com/2017/02/77a512ce99e79bb97ac4c0a9af8c29cd-1024x168.png)
接下来开始新增记录,点击插入按钮
![](http://incdn1.b0.upaiyun.com/2017/02/92125caea7c0449607fa04633f246dc8-1024x324.png)
注意控制台显示,这里执行了inserSQL语句,并remove了count()方法上的缓存,
![](http://incdn1.b0.upaiyun.com/2017/02/e0724ff3d9877a7b309ea62fa822a011-1024x270.png)
接下来再次访问test1.do,我们看到总数变化了,增加了一条,说明我们把之前count()方法上的缓存删除了,又执行了查询总数的sql
![](http://incdn1.b0.upaiyun.com/2017/02/87bdd0f6260623099b166ecd68ea6794.png)
再次访问test1.do,count()方法的缓存生效了,对吧!这个就是@CacheEvict注解的作用。
![](http://incdn1.b0.upaiyun.com/2017/02/6cd779b33a5aaf85e020fc21e2b94e63-1024x159.png)
在insert()方法上还有@CachePut(value=”myCache”)注解,上面的serviceImpl中注释了,它的作用是:@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
我这里就不做演示了,你们可以自己动手试试。
总结:我个人的理解,对查询方法增加缓存容易,但对于缓存的更新的处理就比较麻烦,我上面的serviceImpl中写了三种处理方式,
用@CachePut处理,这中方法需要对指定缓存key保持一致,尽管这样,还是不行,因为它返回的缓存是int(增加或删除或修改的记录数或是该记录的对象,这对我们查询所有或部分记录的缓存还是不可行的)
用@CacheEvict(value=”myCache”,key=”0″,beforeInvocation=true)处理,清除我们指定key的缓存,这种方式缺点是麻烦,需要我们注意每一个缓存的key
用@CacheEvict(value=”myCache”,allEntries=true,beforeInvocation=true)处理,清除所有缓存,这种方式最省事,但会把其他缓存也一同清除。
随着业务的复杂性的不断增加,这些处理方式,可能会增加代码的复杂性,然后我想到的是对DB层进行缓存,可以利用redis,mamchched的进行处理。当然对于一般的web应用运用ehcache已经刻一解决了,但是对大数据量的运用db级别的缓存效果性能可能会更好。
缓存的配置:
第三步:编写model,这里需要注意,要实现缓存的实体必须要序列化 private static final long serialVersionUID = -6579533328390250520L; 关于序列化的生成这里就不介绍了,大家可以百度看看。
![](http://incdn1.b0.upaiyun.com/2017/02/e9fa3a3118814be6d656a76311dfeb48-1024x235.png)
再一次访问testLog.do,运行你会发现没有访问数据库,如图:
![](http://incdn1.b0.upaiyun.com/2017/02/814a3f1b5c1c83131e8d7863fbbe0d2f-1024x138.png)
到此查询的缓存我们实现了,但是关于缓存的处理我们并没有做完,我们应该在深入思考下,在上面查询的缓存生命周期内,我们对刚才查询的表进行了增删改操作,这时我们再访问该查询方法,你会发现我们的数据并没有改变,还是增删改操作之前的数据(因为缓存的生命还在),这里是不是问题呢?此时我们需要对查询的缓存进行更新或删除。
下面我们看serviceImpl中的insert方法和count()方法,count的方法是统计表中的数据总记录,insert方法是对该表进行新增一条记录,insert的缓存注解用的是@CacheEvict(value=”myCache”,key=”0″,beforeInvocation=true),这里清除的是指定缓存,也就是count方法中@Cacheable(value=”myCache”,key=”0″)的,(serviceImpl中注释的@CacheEvict(value=”myCache”,allEntries=true,beforeInvocation=true)是清除所有的缓存,这里我就不演示了,道理是一样的)
这里我提供一个测试pageEhcache.jsp页面,
![](http://incdn1.b0.upaiyun.com/2017/02/af9e404ce1203dcaa87f2bebf9dee44d-1024x236.png)
我们先访问test1.do,看下表中的记录数并注意控制台变化
页面显示如下,注意总数是67,
![](http://incdn1.b0.upaiyun.com/2017/02/102035856a32c3bc5b1b8e6132343b2d.png)
再一次访问test1.do,没有访问数据库,说明count()方法的缓存生效了,
![](http://incdn1.b0.upaiyun.com/2017/02/77a512ce99e79bb97ac4c0a9af8c29cd-1024x168.png)
接下来开始新增记录,点击插入按钮
![](http://incdn1.b0.upaiyun.com/2017/02/92125caea7c0449607fa04633f246dc8-1024x324.png)
注意控制台显示,这里执行了inserSQL语句,并remove了count()方法上的缓存,
![](http://incdn1.b0.upaiyun.com/2017/02/e0724ff3d9877a7b309ea62fa822a011-1024x270.png)
接下来再次访问test1.do,我们看到总数变化了,增加了一条,说明我们把之前count()方法上的缓存删除了,又执行了查询总数的sql
![](http://incdn1.b0.upaiyun.com/2017/02/87bdd0f6260623099b166ecd68ea6794.png)
再次访问test1.do,count()方法的缓存生效了,对吧!这个就是@CacheEvict注解的作用。
![](http://incdn1.b0.upaiyun.com/2017/02/6cd779b33a5aaf85e020fc21e2b94e63-1024x159.png)
在insert()方法上还有@CachePut(value=”myCache”)注解,上面的serviceImpl中注释了,它的作用是:@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
我这里就不做演示了,你们可以自己动手试试。
总结:我个人的理解,对查询方法增加缓存容易,但对于缓存的更新的处理就比较麻烦,我上面的serviceImpl中写了三种处理方式,
用@CachePut处理,这中方法需要对指定缓存key保持一致,尽管这样,还是不行,因为它返回的缓存是int(增加或删除或修改的记录数或是该记录的对象,这对我们查询所有或部分记录的缓存还是不可行的)
用@CacheEvict(value=”myCache”,key=”0″,beforeInvocation=true)处理,清除我们指定key的缓存,这种方式缺点是麻烦,需要我们注意每一个缓存的key
用@CacheEvict(value=”myCache”,allEntries=true,beforeInvocation=true)处理,清除所有缓存,这种方式最省事,但会把其他缓存也一同清除。
随着业务的复杂性的不断增加,这些处理方式,可能会增加代码的复杂性,然后我想到的是对DB层进行缓存,可以利用redis,mamchched的进行处理。当然对于一般的web应用运用ehcache已经刻一解决了,但是对大数据量的运用db级别的缓存效果性能可能会更好。
相关文章推荐
- spring整合ehcache 注解实现查询缓存,并实现实时缓存更新或删除 写在前面:上一篇博客写了spring cache和ehcache的基本介绍,个人建议先把这些最基本的知识了解了才能对今天
- spring整合ehcache 注解实现查询缓存,并实现实时缓存更新或删除
- ehcache-02 : spring整合ehcache 注解实现查询缓存,并实现实时缓存更新或删除
- spring整合ehcache注解实现查询缓存,并实现实时缓存更新或删除
- Spring整合Mybaits实现ehcache 注解查询缓存
- Spring整合Mybaits实现ehcache 注解查询缓存
- spring和ehcache整合,实现基于注解的缓存实现
- spring和ehcache整合,实现基于注解的缓存实现
- Spring基于注解整合Hibernate EhCache实现对象缓存
- 【spring-boot】spring-boot整合ehcache实现缓存机制
- 【jeecg-mybatis版本】 mybatis+spring mvc 完美整合方案 查询,保存,更新,删除自动生成
- spring+ehcache实现的缓存查询参数。
- spring整合ehcache实现缓存
- Spring与ehcache整合,通过Spring原生注解使用缓存
- springboot+EHcache 实现文章浏览量的缓存和超时更新
- Struts2+Ibatis+Spring.30(完整例子,含3.0事务配置,OSCache缓存配置,JreeChart配置,log4j日志输出Sql,对一个表实现完整的查询,批量删除,添加,更新)
- mybatis+spring mvc 完美整合方案 查询,保存,更新,删除自动生成
- springboot+EHcache 实现文章浏览量的缓存和超时更新
- Spring与ehcache整合,通过注解的方式使用缓存
- Spring Boot整合Ehcache实现缓存功能