Mybatis一级缓存二级缓存

本文介绍了Mybatis的一级缓存和二级缓存。一级缓存默认开启,存在于SqlSession级别,而二级缓存需要手动开启,存储在mapper级别。讨论了缓存的安全性和动态代理在确保线程隔离中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一级缓存

1、默认开启,未找到关闭办法
2、缓存级别:SqlSession级别
3、缓存位置:SqlSession.BaseExecutor.PerpetualCache localCache
4、跨SqlSession无法访问

二级缓存
1、开启办法:cache-enabled: true,xml文件需要增加cache标签
2、cache标签readOnly属性设置为false时,实体类必须实现序列化接口;
3、缓存级别:个人认为是mapper级别,也就是namespace级别;
4、缓存位置:SqlSessionFactory会扫描mapper放在Map<String, MappedStatement> mappedStatements,MappedStatement的成员变量Cache cache就是缓存
5、SqlSession.commit()方法之后,数据才会写入缓存

线程安全问题:
1、DefaultSqlSessionFactory是单例,但是成员变量configuration是final类型,可以保证线程安全,也不会有线程进行修改;
2、SqlSession有三个实现:DefaultSqlSession、SqlSessionTemplate、SqlSessionManager

DefaultSqlSession线程不安全,不能多线程使用一个实例;
SqlSessionTemplate和SqlSessionManager通过ThreadLocal来保证sqlsession之间的线程隔离:
SqlSessionTemplate:

private static final ThreadLocal<Map<Object, Object>> resources = new NamedThreadLocal("Transactional resources");

SqlSessionManager:

private final ThreadLocal<SqlSession> localSqlSession = new ThreadLocal<>();

3、使用@Autowired注入mapper时,底层使用的是SqlSessionTemplate来保证线程安全。

动态代理:
SqlSessionTemplate、mapper通过动态代理织入拦截器,保证每次执行前获取新的SqlSession
动态代理可以再深入研究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值