首页 > 编程知识 正文

mybatis一级缓存和二级缓存作用域,mybatis一级缓存和二级缓存执行顺序

时间:2023-05-03 08:57:10 阅读:281702 作者:2425

目录

目录 MyBatis一级缓存MyBatis二级缓存MySql缓存机制

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缓存机制配置文件优化
缓存机制的劣处,不推荐使用的原因

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。