mybatis缓存问题
mybatis一级缓存是默认开启的,且一级缓存作用域为同一sqlSession的同一sql查询语句;
但是常见的注入mapper接口的方式 ,例如:@Autowired private UserDao userDao; 其实它使用了缓存,但两次使用同样的sql语句查询,会发现第二次查询没有使用第一次查询的缓存,而是再次查询数据库,原因是自动注入方式会使用一个sqlSessionProxy 代理对象去执行sql,两次查询都会有新的代理对象,所以mybatis判定它不是同一sqlSession域,所以就查询两次数据库,使用不了上一次的缓存。
所以最好的方法是写一个工具类,手动获取sqlSession,不使用代理:
@Component
public class MybatisUtils {
@Autowired
private SqlSessionFactory sqlSessionFactory;
public <T> T getMapper(Class<T> type){
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession.getMapper(type);
}
}
不过我们在业务开发过程中一般不会在同一方法里调用两次同样的sql查询,所以个人感觉一级缓存其实使用到的地方并不多。