目录
MyBatis一级缓存
MyBatis一级缓存是sesssion会话级别的缓存,是基于当前SqlSession对象的,MyBatis一级缓存实际上是以当前sql为key对执行语句进行缓存(跟mysql缓存一样,修改任何参数的值都会导致缓存失效)
public class Test {
public static void main(String[] args) throws IOException {
String config = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(config);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
System.out.println(session.selectOne("selectUserByID", 1));
// 同一个session的相同sql查询,将会使用一级缓存
System.out.println(session.selectOne("selectUserByID", 1));
// 参数改变,需要重新查询
System.out.println(session.selectOne("selectUserByID", 2));
// 清空缓存后需要重新查询
session.clearCache();
System.out.println(session.selectOne("selectUserByID", 1));
// session close以后,仍然使用同一个db connection
session.close();
session = factory.openSession();
System.out.println(session.selectOne("selectUserByID", 1));
}
}
>如果单独使用Mybatis的话可以对常用的查询进行缓存优化,但是结合spring框架后一级缓存将会失效
整合spring后一级缓存失效是因为整合后是sqlSession的内部实现是使用动态代理实现的,这个动态代理sqlSessionProxy使用一个模板方法封装了select()等操作,每一次select()查询都会自动先执行openSession(),执行完close()以后调用close()方法,相当于每次都是生成了一个新的session实例,所以这样就无法使用mybatis以及缓存。
整合spring后一级缓存失效的原因是因为由spring管理后,spring的session代理封装了select()等操作。每次执行sql后都会调用close()方法,相当于每次都会产生一个新的session实例,所以整合spring后一级缓存是失效的
MyBatis二级缓存
二级缓存相比于一级缓存二级缓存是全局性的缓存不受限于spring动态代理一个查询一个session实例的限制
MySql缓存机制
mysql缓存也是缓存sql文本和查询结果,根据查询语句获取一个hash值然后去查看缓存,如果没有匹配缓存则再次去解析和执行sql。
mybatis缓存机制详解
mybatis一二级缓存略解
mysql缓存机制详解
mysql缓存机制配置文件优化
缓存机制的劣处,不推荐使用的原因