目录
编辑
一、MyBatis运行顺序
二、一级缓存
(1)一级缓存失效的四种情况
1.查询时所使用的sqlSession不同
2.sqlSession相同但是当前查询条件不同
3.sqlSesssion相同,但两次查询之间进行了增删改的操作
4.手动清除了一切缓存
三、二级缓存
(1)开启二级缓存的四个条件
(2)Cache参数
一、MyBatis运行顺序
在Test类中,在@Test注解前还有@Before和@After注解,其中@Before在测试执行前进行,@After在执行后进行
MyBatis运行的流程图如下所示 :
sqlSession对象本质上是堆里开辟的一块内存空间。sqlSessin对象创建后会通过executor执行,并在本地生成本地缓存,这样,在第二次调用该sql语句时,即可直接调用缓存
我们写一个简单的例子进行测试
执行结果我们可以看到,只执行了一次sql语句(第二次调用本地缓存)
并且二者指向的的地址都为同一个
二、一级缓存
一级缓存: sqlSession级别的缓存
(1)一级缓存失效的四种情况
1.查询时所使用的sqlSession不同
定义两个session,factor可以生成多个session对象。吧
此时的结果为
2.sqlSession相同但是当前查询条件不同
3.sqlSesssion相同,但两次查询之间进行了增删改的操作
如果进行了增删改的操作,数据库的内容发生更改,本地缓存也一定会变化,否则就会查找到错误的信息。换句话说,也就是为了保证缓存一致性
4.手动清除了一切缓存
session1.clearCache();
//手动清除一级缓存
三、二级缓存
二级缓存:sqlSession Factory,二级缓存默认情况下是关闭的
(1)开启二级缓存的四个条件
①:在核心配置文件中,设置全局属性caheEnable="true"。
②:在映射件中置<Cache>
注意!哪个映射文件中写上了cache,哪个文件才会开启二级缓存
③:查询数据所转换的实体类类型必须实现序列化接口
④:二级缓存必须在SqlSession关闭或提交之后有效,即必须让一级缓存失效才可以使用二级缓存
这里还是两个session的情况
结果如下
注意!一级缓存中缓存的是对象,二级缓存缓存的是数据,不是对象。
(2)Cache参数
LRU(最近最少使用的):移除最长时间不被使用的对象,这是默认值。
FIFO(先进先出):按对象进入缓存的顺序来移除它们。
SOFT(软引用):移除基于垃圾回收器状态和软引用规则的对象。
WEAK(弱引用):更积极地移除基于垃圾收集器状态和弱引用规则的对象。
flushinterval(刷新间隔):可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。(默认情况不设置,即没有刷新间隔,缓存仅仅在调用语句时刷新。)
size(引用数目):可以被设置为任意正整数,要记住缓存的对象数目和运行环境的可用内存资源数目。默认值是1024 。
readOnly(只读):属性可以被设置为 true / false。
- true:只读缓存:会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改, 这提供了很重要的性能优势。
- false读写缓存: 通过序列化返回缓存对象的拷贝,这种方式会慢一些,但是安全,因此默认是 false。