mybatis补充教程之三:缓存(cache)的使用

摘要: 许多应用程序,为了提高性能而增加缓存, 特别是从数据库中获取的数据. 在默认情况下,mybatis 的一级缓存是默认开启的。类似于hibernate, 所谓一级缓存,也就是基于同一个sqlsession 的查询语句,即 session 级别的缓存,非全局缓存,或者非二级缓存.如果要实现 mybatis 的二级缓存,一般来说有如下两种方式:1. 采用 mybatis 内置的 cache 机制。2. 采用三方 cache 框架, 比如ehcache, oscache 等等.

许多应用程序,为了提高性能而增加缓存, 特别是从数据库中获取的数据. 在默认情况下,mybatis 的一级缓存是默认开启的。类似于hibernate, 所谓一级缓存,也就是基于同一个sqlsession 的查询语句,即 session 级别的缓存,非全局缓存,或者非二级缓存.

如果要实现 mybatis 的二级缓存,一般来说有如下两种方式:
1. 采用 mybatis 内置的 cache 机制。
2. 采用三方 cache 框架, 比如ehcache, oscache 等等.

采用 mybatis 内置的 cache 机制。
在 sql 语句映射文件中加入<cache /> 语句 , 并且相应的 model 类要实现 java Serializable 接口,因为缓存说白了就是序列化与反序列化的过程,所以需要实现这个接口. 单纯的 表示如下意思:

1.所有在映射文件里的 select 语句都将被缓存。
2.所有在映射文件里 insert,update 和 delete 语句会清空缓存。
3.缓存使用“最近很少使用”算法来回收
4.缓存不会被设定的时间所清空。
5.每个缓存可以存储 1024 个列表或对象的引用(不管查询出来的结果是什么) 。
6.缓存将作为“读/写”缓存,意味着获取的对象不是共享的且对调用者是安全的。不会有其它的调用者或线程潜在修改。
缓存元素的所有特性都可以通过属性来修改。比如:

<cache eviction=""FIFO"" flushinterval=""60000"" size=""512"" readonly=""true"">
</cache>

采用 ehcache 来实现 mybatis 的二级缓存

首先需要在 mybatis 的官网上下载相关jar 包:https://code.google.com/p/mybatis/ 写文档的时候下载的是:mybatis-ehcache-1.0.2.zip ,里面包括了

mybatis-ehcache-1.0.2.jar
ehcache-core-2.6.5.jar
slf4j-api-1.6.1.jar

当然,采用ehcache 就必须在 classpath 下 加入ehcache 的配置文件 ehcache.xml:

<cache name=""default"" maxelementsinmemory=""10000"" eternal=""false"" timetoidleseconds=""3600"" timetoliveseconds=""10"" overflowtodisk=""true"" diskpersistent=""true"" diskexpirythreadintervalseconds=""120"" maxelementsondisk=""10000"">
</cache>

那么在 sql 映射文件中要如何配置呢,参考如下:

<cache type=""org.mybatis.caches.ehcache.LoggingEhcache"">
        <property name=""timeToIdleSeconds"" value=""3600"/"><!--1 hour-->
        <property name=""timeToLiveSeconds"" value=""3600"/"><!--1 hour-->
        <property name=""maxEntriesLocalHeap"" value=""1000"/">
        <property name=""maxEntriesLocalDisk"" value=""10000000"/">
        <property name=""memoryStoreEvictionPolicy"" value=""LRU"/">
</cache>

总结:无论是采用mybatis 自身的cache 还是三方的cache , 这样的配置,就是对 所有的select 语句都全局缓存,但事实上,并不总是这样,比如,我在这系列教程中第七章中 http://www.yihaomen.com/article/java/326.htm,自己写的分页算法,就不能用这种情况。需要禁止掉cache ,所以需要如下方法:

<select id=""selectArticleListPage"" resultmap=""resultUserArticleList"" usecache=""false"">
.......
注意到 useCache="false" 了吗? 这可以避免使用缓存


上一篇: django 防止 XSS 注入的方法
下一篇: Spring MVC 类型转换(type convert)例子及下载

Avatar

11 评论于: 2015-11-29

11

Avatar

16 评论于: 2015-04-06

limit 方式分页要加上 useCache = "false"  ??

Avatar

minggxu9 评论于: 2013-12-21

你好,在什么时候不使用二级缓存呢,除了分页的情况以外。
[reply=轻舞肥羊,2013-12-21 10:53 PM]基本上一般的应用都不会用到二级缓存,一级缓存足够了。
二级缓存一般基于以下原则:
1. 不经常变动的数据,但经常会使用
2. 数据量比较大,系统多处会用到。或者跨系统用。
3. 对性能有特别要求的地方。

滥用二级缓存,有可能反而会降低性能,特别是查询缓存,是根据查询条件来的。[/reply]
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号