MyBatis系统缓存和自定义缓存

1、 系统缓存(一级缓存)
Mybatis对缓存提供支持,在没有开启缓存的情况下,mybatis会默认开启一级缓存(一级缓存只是相对于同一个SQLSession而言)
所以在参数和SQL完全一样的情况下,我们使用同一个SQLSession对象调用同一个Mapper的方法,往往只执行一次SQL,因为SQLSession在第一次查询之后,mybatis会将其放入缓存,后续再次查询时,在缓存没有超时的情况下,SQLSession会取出当前的缓存,不再把SQL发往数据库。如果在这里使用的是不同的SQLSession,即便是同样的参数和SQL,也不会使用缓存。
2、 系统缓存(二级缓存)
由于一级缓存属于SQLSession层面的,每个SQLSession又是隔离的,为了能共享缓存对象,就需要配置二级缓存,使得缓存在SQLSessionFactory层面上能提供给各个SQLSession对象共享。在默认情况下,二级缓存是不开启的,开启二级缓存需要进行配置,实现二级缓存的时候,mybatis要求返回POJO必须是可序列化的,也就是要求实现serializable接口(否则会抛异常 ),开启二级缓存的配置很简单,只需要在XML文件配置开启就好了
例如:
如果只是这样配置的话,很多配置都会采用默认值:
a)映射文件的所有的select语句会被缓存
b)映射语句中的所有insert、update、delete语句会刷新缓存
c)缓存会使用默认的Least Recently Used(LRU)算法来回收
d)根据时间表,比如没有No Flush Interval(CNFI,没有刷新间隔),缓存不会以任何时间顺序来刷新
e)缓存会存储列表或对象(无论查询方法返回什么)的1024个引用
f)缓存会被视为read/write的缓存,意味着对象检索是不共享的,而且可以安全的被调用者修改,不干扰其他调用者或者线程所在的潜在修改
对于二级缓存的配置我们是可以修改的,例如

解释:
eviction:代表是缓存回收策略,目前mybatis提供以下策略:
a) LUR:最近最少使用的,移除最长时间不用的对象
b) FIFO:先进先出,按照对象进入缓存的顺序来移除他们
c) SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象
d) WEAK:弱引用,更积极地移除基于垃圾回收器状态和弱引用规则的对象
flushInterval:刷新间隔时间,单位为毫秒,如果不配置,当SQL被执行的时候才会去刷新
size:引用数目,一个正整数,带便缓存可以缓存多少个对象,不宜设置太大,过大会导致内存溢出
readOnly:只读,默认为false,设置为只读后我们只能访问缓存而不能修改
3、 自定义缓存
系统缓存是mybatis在应用服务器上的本地缓存,在大型服务器上,会采用缓存服务器,这时我们可以采用redis等缓存。采用自定义缓存需要实现mybatis的接口:org.apache.ibatis.cache.Cache,缓存接口需要自己实现,假如我们已经存在一个实现类:com.cache.test.CacheTest,我们的配置如下:

注:以上内容根据《深入浅出mybatis技术原理与实战》一书整理编写,感谢作者的辛勤劳作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值