网站建设营销的公司,免费咨询法律律师在线12348,在线制作网页网站,深圳个性化建网站服务商Mybatis缓存
MyBatis包含一个非常强大的查询缓存特性#xff0c;它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。 MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存 默认情况下#xff0c;只有一级缓存开启。(SqlSession级别的缓存#xff0c;也称为本地…Mybatis缓存
MyBatis包含一个非常强大的查询缓存特性它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。 MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存 默认情况下只有一级缓存开启。(SqlSession级别的缓存也称为本地缓存) 二级缓存需要手动开启和配置他是基于namespace级别的缓存。 为了提高扩展性MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存
一级缓存
一级缓存也叫本地缓存: 与数据库同一次会话期间查询到的数据会放在本地缓存中 以后如果需要获取相同的数据直接从缓存中拿没必须再去查询数据库
在Mapper接口中定义一个根据id查用户的方法 在Mapper.xml中编写对应sql 编写测试类在同一次会话中两次查询相同的用户 通过日志可以发现只有第一次调用该方法时执行了sql语句第二次再调用则用户信息直接被查询了出来并没有执行对应的sql这是因为第一次的查询结果被放到了一级缓存中去了 再Mapper接口中再定义一个更新用户信息的方法 在Mapper.xml中编写对应的sql 再次编写测试类在刚才测试类中两次查询用户的中间再插入一个更新用户的操作即使更新的用户不是这两次查询的用户 通过日志可以看到两次虽然查询的用户虽然是一致的但是第二次的查询依然执行了sql因为改删增操作会直接刷新缓存
、
缓存失效的情况:
1.查询不同的东西 2.增删改操作可能会改变原来的数据所以必定会刷新缓存! 3.查询不同的Mapper.
或者说也可以在一个会话中自己手动清理缓存sqlSession.clearCache();//手动清理缓存 可以看到依然执行了两次sql操作 二级缓存
二级缓存也叫全局缓存一级缓存作用域太低了所以诞生了二级缓存 基于namespace级别的缓存一个名称空间对应一个二级缓存 工作机制 一个会话查询一条数据这个数据就会被放在当前会话的一级缓存中; 如果当前会话关闭了这个会话对应的一级缓存就没了;但是我们想要的是会话关闭了一级缓存中的 数据被保存到二级缓存中; 新的会话查询信息就可以从二级缓存中获取内容 不同的mapper查出的数据会放在自己对应的缓存(map)中
在核心配置文件中显示开启全局缓存不加也可默认就有 在一个Mapper.xml中加入一个cache标签开启二级缓存 也可详细的配置 编写测试类可以看到两个会话查询相同的用户也用不了一级缓存要走两次sql 编写测试类先查一次用户的信息然后直接关闭会话信息被缓存到二级缓存中再次查可以直接从二级缓存中查到该用户信息故第二次没有sql 小结:
只要开启了二级缓存在同一个Mapper下就有效 所有的数据都会先放在一级缓存中; 只有当会话提交或者关闭的时候才会提交到二级缓存中!
缓存顺序