Mybatis一级缓存和二级缓存

来源:互联网 发布:淘宝店过户费用 编辑:程序博客网 时间:2024/05/01 07:05

目录

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

原创粉丝点击