时间:2021-05-20
一级缓存概念
当我们使用Mybatis进行数据库的操作时候,会创建一个SqlSession来进行一次数据库的会话,会话结束则关闭SqlSession对象。那么一个SqlSession的生命周期即对应于Mybatis的一次会话。在Mybatis的一次会话中,我们很有可能多次查询完全相同的sql语句,如果不采取措施的话,每一次查询都查询一次数据库。而一次会话时间一般都是极短的,相同Sql的查询结果极有可能完全相同。由于查询数据库代价是比较大的,这会导致系统的资源浪费。
为了解决这个问题,Mybatis对每一次会话都添加了缓存操作。这个缓存的作用域为一次会话中。缓存随着会话(SqlSession)的创建而产生,随着会话结束而释放。对一次会话的查询操作,总是先查看缓存中是否存在查询结果,如果存在则直接取缓存中的结果,不存在则查询数据库。这样的话,一次会话中的完全相同的查询则只会查询一次,节省了系统资源。
引言
MyBatis 一级缓存(MyBaits 称其为 Local Cache)无法关闭,但是有两种级别可选:
package org.apache.ibatis.session;/** * @author Eduardo Macarron */public enum LocalCacheScope { SESSION, //session 级别的缓存 STATEMENT //statement 级别的缓存}1)session 级别的缓存
在同一个 sqlSession 内,对同样的查询将不再查询数据库,直接从缓存中。
验证代码:
[
public static void main(String[] args) throws IOException { InputStream inputStream = new ClassPathResource("mybatis.xml").getInputStream(); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); System.out.println(mapper.get(1L)); System.out.println("-------------------"); System.out.println(mapper.get(1L));}输出:
日志输出可以看到,第一次查询通过数据库查询,第二次则没有,直接通过缓存读取。
坑:这种缓存策略有一个坑,在服务集群时就会出现问题。
假设现在有一个服务集群,有两个节点。
首先,两个节点都进行了同样的查询,两个节点都有自己的一级缓存,后续同样的查询,两个节点将不再查询数据库。
如果此时节点 1 执行了 update 语句,那么节点 1 的一级缓存会被刷新,而节点 2 的一级缓存不会改变。
2)statement 级别的缓存
避坑: 为了避免这个问题,可以将一级缓存的级别设为 statement 级别的,这样每次查询结束都会清掉一级缓存。MyBatis 源码如下:
在 MyBatis 的配置文件中,添加以下配置:
验证代码和上面的一样不变。
输出:
可以看到,即使是同样的查询,每次查询都是直接读取数据库了。
避坑完毕。
缓存是不可能不要缓存的,这个时候,就需要使用缓存中间件了,由缓存中间件管理缓存。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
mybatis中提供有一级缓存和二级缓存,这里记录一下一级缓存一级缓存(mybatis中默认开启)SqlSession级别的缓存,操作数据库时需要构造SQLSe
一、MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis同样提供了一级缓存和二级缓存的支持1.一级缓存:基于PerpetualCache的Hash
一.概述先讲缓存实现,主要是mybatis一级缓存,二级缓存及缓存使用后续补充Mybatis缓存的实现是基于Map的,从缓存里面读写数据是缓存模块的核心基础功能
上篇文章给大家介绍了mybatis一级缓存,有需要的朋友可以参考下。与一级缓存相比,二级缓存范围更大了一些,可以被多个SqlSession所共用。同样是发送同样
MyBatis的一级缓存是sqlSession作用域的,默认开启,执行DML(insert,update,delete)操作后自动删除。下面介绍一下如何开启My