m-y-b-a-t-i-s一级缓存关

题外话:
1.一级缓存只有在开启了数据库事物【@EnableTransactionManagement】并且处于一个被事物标注的方法下【直接或间接】才会生效。

2.禁用一级缓存:mybatis没有提供一级缓存的启用、禁用开关,但在Mapper文件对应的语句中增加flushCache="true"可以达到实际禁用一级缓存的效果,一般同时还会加上useCache="false",以便关闭二级缓存;下面讨论使用springboot配置的方式控制一级缓存。

一、在springboot下的配置
MyBatis 一级缓存(MyBaits 称其为 Local Cache)无法关闭,但是有两种级别可选:

A.session
        在同一个 sqlSession 内,对同样的查询将不再查询数据库,直接从缓存中获取。

mybatis:
  configuration:
    cache-enabled: false  #禁用二级缓存
    local-cache-scope: session  #一级缓存指定为session级别
B.statement
        每次查询结束都会清掉一级缓存,实际效果就是禁用了一级缓存;

mybatis:
  configuration:
    cache-enabled: false #禁用二级缓存
    local-cache-scope: statement #一级缓存指定为statement级别
二、不同设置方式在数据库事物中的表现
@Transactional(propagation = Propagation.REQUIRED)
public List<Users> getUsers() {
    List<Users> usersList = usersMapper.selectByExample(new UsersExample());  #1
    usersList = usersMapper.selectByExample(new UsersExample());  #2
    return usersList;
}
A.一级缓存级别设置为session

在代码中1处,通过日志观察,打印出sql语句,未走缓存【此时缓存数据还不存在】;

在执行2处语句之前,通过数据库工具修改数据库记录并提交,继续执行程序后,通过日志观察,未打印出sql语句,获取的数据未体现出通过工具修改数据的变化,说明使用的是缓存中的数据;

B.一级缓存级别设置为statement

在代码中1处,通过日志观察,打印出sql语句,未走缓存【此时缓存数据还不存在】;

在执行2处语句之前,通过数据库工具修改数据库记录并提交,继续执行程序后,通过日志观察,打印出sql语句,且获取的数据也体现出通过工具修改数据的变化,说明未使用缓存中的数据;

结论:通过将一级缓存级别设置为statement,可以达到禁用一级缓存的效果。
@Transactional(propagation = Propagation.REQUIRED)
public List<Users> getUsers() {
    List<Users> usersList = usersMapper.selectByExample(new UsersExample());  #1
    usersList = usersServer.getUsersList();
    return usersList;
}
#下面的代码属于usersServer

@Transactional(propagation = Propagation.NESTED)  #3
public List<Users> getUsersList() {
    return usersMapper.selectByExample(new UsersExample());  #2
}
观察到的结果与上面的一致。

结论:同上,同时证明了嵌套事物NESTED本质上与上层事物处于一个相同的事物中。
将代码3处事物配置调整成REQUIRES_NEW,重做之前的实验;

观察到的结果:在一级缓存级别为session与statement时,现象一致,带执行代码2处,均打印SQL语句,并且体现出了手动修改数据库记录的效果;

结论:REQUIRES_NEW确实重新起了一个新的事物,与上层事物没有关系。
终极结论:
1.将mybatis一级缓存级别设置为statement可以事实上达到禁用一级缓存的效果;
2.启用mybatis一级缓存,将级别设置为session【或不做任何设置,mybaits默认就是这个级别】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值