mybatis查询缓存

一级缓存针对每个sqlSession进行缓存,sqlSession销毁,一级缓存就不存在. ,使用Map存储了sql执行查询结果集(java对象)

二级缓存针对每个map的namespace进行缓存. mybatis程序运行起来二级缓存的数据结构就创建出来,直到mybatis程序停止二级缓存数据结构销毁

 map中存储了sql执行查询的结果集(java对象) 二级缓存是在configeration的全局数据结构当中

要想执行二级缓存sqlSession必须关闭.

1.1 一级缓存原理 

 

如果执行增删改操作,执行commit,会清空sqlsession缓存.

跟踪源代码,一级缓存的区域:

1.2 二级缓存原理 

如果sqlsession3执行增删改,执行commit后,UserMapper下的所有缓存全部清空.

 1.开启二级缓存 

  mybatis对一级缓存是默认支持,二级缓存需要开启

打开总开关:在核心配置文件SqlMapConfig.xml加入:<setting name="cacheEabled "  value="true">

打开mapper的二级开关:在mapper.xml中加入:<cache/>

对象序列化

mybatis支持使用第三方缓存框架实现二级缓存数据的存储,要求对象必须实现序列化(实体类 implements Serializable)。

通过源码跟踪:

 

设置statement是否二级缓存

useCache=true表示要二级缓存,一般要对查询进行二级缓存。

useCache=false,查询该 statement不进行二级缓存,针对那些查询非常频繁的语句,信息的变化性较高,可以将useCache设置false不进行二级缓存。

刷新缓存

针对insertupdatedelete这些statement设置flushCache="true" 表示执行commit就清空二级缓存,如果设置flushCache="false",执行操作也不清空缓存。

一般情况下需要设置flushCache="true" ,为了避免查询出脏数据。

 其它的参数

flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。

size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024

readOnly(只读)属性可以被设置为truefalse。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false

原文地址:https://www.cnblogs.com/wwwzzz/p/8285056.html