1、概念
MyBatis的一级缓存最大范围是SqlSession内部,即一级缓存只是对当前 SqlSession 中的 SQL 语句有效。
MyBatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,同时粒度更加的细,能够到namespace级别(针对同一个 Mapper 中不同的 SqlSession),通过Cache接口实现类不同的组合,对Cache的可控性也更强。
从Spring事务管理器中获取一个sqlsession,如果没有,则创建一个新的,这句话的意思其实就是如果是一个事务,则这个事务里所有的 SQL 操作 的 sqlSession 用一个;如果没有,每条 SQL 操作都是用新的。
再通俗易懂一点:如果在事务里,则Spring给你的sqlSession是一个,否则,每一个sql给你一个新的sqlSession。这里生成的sqlSession其实就是DefaultSqlSession了。
2、事例
其实,Mybatis的一级缓存就是 SqlSession 级别的,只要SqlSession 不变,则默认缓存生效,也就是说,如下的代码,实际上只会查一次库的:
XxxxxMapper xxxxxMapper = session.getMapper(xxxxxMapper.class);
//对应的sql为: select id from test_info;
xxxxxMapper.selectFromDb();
xxxxxMapper.selectFromDb();
xxxxxMapper.selectFromDb();
实际上只会被执行一次 SQL 查询。
但是,在日常使用中,我们都是使用spring来管理Mapper,在执行selectFromDb 这个操作的时候,其实每次都会有一个新的SqlSession,所以,Mybatis的一级缓存是用不到的。
3、总结
所谓 mybatis 一级或者二级缓存弱鸡的要死,难怪没人用。
网友评论