一级缓存
一级缓存是基于sqlsession默认开启的,在操作数据库时需要构造SqlSession对象,在对象中有一个HashMap用于存储缓存数据。不同的SqlSession之间的缓存数据区域是互相不影响的。
一级缓存作用是sqlsession范围的,在同一个sqlsession中执行两次相同的sql时,第一次得到的数据会缓存放在内存中,第二次不再去数据库获取,而是直接在缓存中获取,提高效率。
在中间如果执行了增删改并提交到数据库,mybatis是会把sqlsession中的一级缓存清空的,这样是为了数据的准确性,避免脏读现象。
当关闭一个sqlsession时,一级缓存也随之消失。
二级缓存
二级缓存是基于mapper的namespace作用域,但多个sqlsession操作同一个namespace下的sql时,并且传入的参数也相同,执行相同的sql语句,第一次执行完毕后会讲数据缓存,这就是二级缓存。
二级缓存同样是使用HashMap进行数据存储。相比一级缓存SqlSession,二级缓存的范围更大,多个Sqlsession可以共用二级缓存,二级缓存它是可以跨越多个sqlsession的。
开启,在MyBatis的全局配置settings中有一个参数cacheEnabled,这个参数是二级缓存的全局开关
<settings>
<setting name="cacheEnabled" value="true" />
</settings>
默认值是true,
在保证二级缓存全局配置开启情况下,给mapper.xml开启二级缓存添加元素即可,如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.pd.samary.module.app.message.mapper.PdMessageMapper">
<cache/>
<!-- 其他配置-->
</mapper>
默认的二级缓存会有如下效果:
· 映射语句文件中的所有SELECT语句将会被缓存。
· 映射语句文件中所有INSERT、UPDATE、DELETE语句会被刷新缓存。
· 缓存会使用Least Recently Used 算法来收回。
· 根据时间表(如 no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序来刷新。
· 缓存会存储集合或对象(无论查询方法返回什么类型的值)的1024个引用。
· 缓存会被视为read/write(可读/可写)的,意味着对象检索不是共享的,而且可以安全地被调用者修改,而不扰其他调用者或线程所做的潜在修改。