Mybatis一级缓存、二级缓存

一级缓存:SqlSession

mybatis一级缓存是指在内存中开辟一块区域,用来保存用户对数据库的操作信息(sql)和数据库返回的数据,如果下一次用户再执行相同的请求,那么直接从内存中读数数据而不是从数据库读取。

SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder来构建SqlSessionFactory实例,一旦创建了 SqlSessionFactory,就不再需要SqlSessionFactoryBuilder 了,当然可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例。

SqlSessionFactory: 每个MyBatis集成的应用都是以一个SqlSessionFactory实例为中心,一旦被创建就应该在应用的运行期间一直存在。使用 SqlSessionFactory 是在应用运行期间不需要创建多次,有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession:SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它用于请求或方法范围。不能将 SqlSession 实例的引用放在一个类的静态域,或者一个类的实例变量。应用每次收到客户端一个 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,然后关闭它。

在spring mvc 架构中,每次请求都会客户端的请求都会通过控制层(controller)进入业务层(service),在业务层不加事务的情况下,如果是调用个mapper接口执行数据库操作,则每次请求都会创建一个SqlSession去操作数据库。

一级缓存使用场景:
在service层多次请求同一个mapper接口操作数据库,并且每次请求的参数不变,则第一次执行后就会触发一级缓存的使用,不再执行sql去查询数据库,直接读取缓存的数据。

对SqlSession执行Commit操作,也就是对数据库执行了update、delete、insert等操作,会清除一级缓存保存数据的HashMap结构数据,用户在发起查询请求时就会重新读取数据并放入一级缓存中了。

每次查询回去缓存中查找,如果找不到会去数据库查询,然后把查询结果写入缓存中。Mybatis内部使用HashMap结构存储缓存数据,key为hashCode + statementId + sql 语句,value 为查询出来的结果集映射成的java对象。

当MyBatis与spring整合后,如果没有事务,一级缓存是失效的。解决该问题的办法有两种途径:
有两种途径:
1.添加事务
2.使用二级缓存

二级缓存:Namespace

二级缓存的作用域是一个namespace。但并不是意味着同一个namespace的mapper接口可以互相读取缓存内容,如果开启了二级缓存,那么在关闭sqlsession后,会把该sqlsession一级缓存中的数据添加到namespace的二级缓存中。

开启二级缓存:
1.打开二级缓存总开关

<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>

2.打开mapper的二级缓存开关
在mapper文件加入:

</cache>

3.涉及二级缓存mapper操作的实例对象需要实现Serializable接口。

默认sqlsession提交事务后会关闭,并且会刷新缓存数据,如果在select 标签加入 flushCache=“false” 则会禁止刷新,或者配置mapper 文件的<cache flushInterval=“1000”/ > 属性,定期刷新缓存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值