Mybatis学习笔记11 缓存相关

Mybatis学习笔记10 高级映射及延迟加载_biubiubiu0706的博客-CSDN博客

缓存:cache

缓存的作用:通过减少IO的方式,来提高程序的执行效率

Mybatis的缓存:将select语句的查询结果放到缓存(内存)当中,下一次还是这条select语句的话,直接从缓存中取,不再查数据库.一方面是减少了IO.另一方面不再执行繁琐的查找算法.提高效率.

Mybatis自带的缓存机制包括:

一级缓存:将查询到的数据存储到SqlSession中.

二级缓存:将查询到的数据存储到SqlSessionFactory中.

或者集成其他第三方的缓存:比如EhCache(Java语言开发的),Memcache(C语言开发的)等

SqlSession和SqlSessionFactory的生命周期

Mybatis学习笔记11 缓存相关_第1张图片

SqlSessionFactory:一旦被创建就应该在应用的运行期间一直存在.

SqlSession:每一个线程都应该有它自己的SqlSession实例.

那么一级缓存就是说一个线程内的多次的相同查询会被缓存.也就是说只针对当前会话.而且默认开启

而二级缓存是存放在SqlSessionFactory中的.那么会在整个应用访问期间一直存在

Mybatis中的缓存只针对DQL语句,也就是说缓存机制只对应select语句

Mybatis学习笔记11 缓存相关_第2张图片

先来看一个例子,这是上篇结尾的测试

Mybatis学习笔记11 缓存相关_第3张图片

大概目录结构  进行测试

Mybatis学习笔记11 缓存相关_第4张图片

1.一级缓存

Mybatis中一级缓存默认开启,不需要任何配置.

只要使用同一个SqlSession对象执行同一条SQL语句,就会走缓存.

Mybatis学习笔记11 缓存相关_第5张图片

Mybatis学习笔记11 缓存相关_第6张图片

查数据库没有的

Mybatis学习笔记11 缓存相关_第7张图片

Mybatis学习笔记11 缓存相关_第8张图片

再测试

Mybatis学习笔记11 缓存相关_第9张图片

Mybatis学习笔记11 缓存相关_第10张图片

什么时候不走一级缓存

1.SqlSession对象不是同一个,因在SqlSessionUtil里用了ThreadLocal,所以演示sqlSession不一样,需要从SqlSessionFactory里取

Mybatis学习笔记11 缓存相关_第11张图片

2.查询条件不一样

Mybatis学习笔记11 缓存相关_第12张图片

什么时候一级缓存失效?

第一次DQL和第二次DQL之间做了以下两件事中的任意一件,都会让一级缓存清空.

1.执行了sqlSession的clearCache()方法.这是手动清空缓存

2.执行了INSERT或DELETE或UPDATE语句.注意:不管你操作的是那张表.都会清空一级缓存

测试.clearCache()

Mybatis学习笔记11 缓存相关_第13张图片

测试执行了任意表的增删改操作  这里忘记commit了 但即使没有commit缓存也清空了

注意:sqlSession.close()方法,只是关闭sqlSession,如果用了连接池,只是将sqlSession的状态更改为不可用,和commit没有关系,如果开启了事务,没有commit就不会提交

Mybatis学习笔记11 缓存相关_第14张图片

commit了

Mybatis学习笔记11 缓存相关_第15张图片

二级缓存

二级缓存的范围是SqlSessionFactory(应用运行期间)

使用二级缓存需要同时具备以下几个条件:

1.在Mybatis核心配置文件中配置全局性的开启或关闭所有映射配置文件(XXX.xml)中已配置的任何缓存.默认就是true,一般无需设置.

2.在需要使用二级缓存的XXX.xml映射文件中添加:

3.使用二级缓存的实体类对象必须是可序列化的,也就是必须实现java.io.Serializable接口

4.SqlSession对象关闭或提交之后,一级缓存中的数据才会被写入到二级缓存当中.此时二级缓存才可用.

要求1--->默认开启

要求2--->在需要使用二级缓存的XXX.xml映射文件中添加:

Mybatis学习笔记11 缓存相关_第16张图片

要求3--->实现序列化接口

Mybatis学习笔记11 缓存相关_第17张图片

要求4--->SqlSession对象关闭或提交之后,一级缓存中的数据才会被写入到二级缓存当中.此时二级缓存才可用.

Mybatis学习笔记11 缓存相关_第18张图片

Mybatis学习笔记11 缓存相关_第19张图片

如果这样的话都不会存到

Mybatis学习笔记11 缓存相关_第20张图片

Mybatis学习笔记11 缓存相关_第21张图片

注意日志中的缓存命中率

Mybatis学习笔记11 缓存相关_第22张图片

二级缓存什么时候失效:只要两次查询之间出现了增删改操作,二级缓存就会失效.当然一级缓存也会失效

二级缓存相关配置

Mybatis学习笔记11 缓存相关_第23张图片

Mybatis学习笔记11 缓存相关_第24张图片

Mybatis学习笔记11 缓存相关_第25张图片

Mybatis学习笔记11 缓存相关_第26张图片

Mybatis学习笔记11 缓存相关_第27张图片

Mybatis集成EhCache

注意:集成EhCache是为了代替Mybatis得二级缓存,一级缓存无法替代.

也就是说集成EhCache是将原先保存在SqlSessionFactory中的缓存,放到第三方缓存插件中

Mybatis对外提供了接口.可以集成第三方缓存组件.比如EhCache,MemCache等

集成EhCache步骤:

1.引入依赖

<dependency>
<groupId>org.mybatis.cachesgroupId>
<artifactId>mybatis-ehcacheartifactId>
<version>1.2.2version>
dependency>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-classicartifactId>
<version>1.2.11version>
<scope>testscope>
dependency>
2.在类的根路径下新建ehcache.xml文件,并配置以下配置信息


    
    

    
    
    
    
    
    
    
    
    
    
    
    

3.修改XXX.xml(映射文件)文件中的标签,添加type属性

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

Mybatis学习笔记11 缓存相关_第28张图片

你可能感兴趣的:(mybatis,学习,笔记)