使用缓存的关键,在于存储内容访问的命中率。
系统缓存
Mybatis对缓存提供支持,系统缓存是Mybatis应用机器上的本地缓存。
一级缓存
在没有配置的默认情况下,Mybatis只开启一级缓存。
一级缓存只是相对于同一个SqlSessioni而言,在参数和SQL完全一样的情况下,使用同一个SqlSession对象调用同一个Mapper的方法,往往只执行一次SQL。因为使用SqlSession第一次查询后,Mybatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没超时的情况下,SqlSession都只会取出当前缓存的数据,而不会再次发送SQL到数据库。
二级缓存
二级缓存中,缓存在SqlSessionFactory层面上能够提供给各个SqlSession对象共享。二级缓存的配置要求:
1. xml中添加<cache/>配置;
这句配置代表着:
a.映射语句文件中的所有select语句将会被缓存;默认缓存1024个对象,也可通过cache的size属性,来配置缓存最多可以存储多少个对象。
b.映射语句文件中的所有insert、update和delete语句会刷新缓存;也可以通过cache的flushInterval属性,来配置每隔多少毫秒刷新缓存;
c.缓存会使用默认的Least Recently Used(LRU,最近最少使用的)算法来收回;可以通过cache的eviction属性来修改为:LRU、FIFO、SOFT、WEAK等策略
d.缓存是可读可写的,可以安全地被调用者修改,不干扰其他调用者。
2.返回的POJO中必须是可序列化的,便于将对象写入缓存。
自定义缓存
在大型服务器上,会使用不同的缓存服务器,比如Redis缓存。
我们需要实现Mybatis为我们提供的接口org.apache.ibatis.cache.Cache.
然后配置<cache type="com.lsq.MyCache"/>就可以使用自定义的缓存了。
通过cache的property子元素,我们可以定时MyCache的属性;
也可以在select、insert、update、delete等元素上定制SQL的缓存策略。例如:
<select ... flushCache="false" useCache="true">
<insert... flushCache="true">
<update... flushCache="true">
<delete... flushCache="true">