zoukankan      html  css  js  c++  java
  • MyBatis--一级二级缓存

    一.一级二级缓存

    注意点:
    • mybatis和spring整合,一级缓存会失效
      • 原因: mybatis和spring结合使用的时候,将原本的DefaultSqlSession替换成了SqlSessionTemplate,并且在SqlSessionTemplate将sqlSession替换成了代理对象,当我们执行sqlSession.selectList方法的时候会调用到SqlSessionInterceptor的invoke方法, 在invoke方法的fianlly中调用了SqlSessionUtils.closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory)方法,会将我们的session关闭了。而一旦session关闭了,那一级缓存自然也就失效了。

    二.一级缓存

     
     
    一级缓存,一级缓存是SqlSession级别的缓存
    说明:
    • 必须在同一个sqlSession对象中,分别两次查询同一个数据,在第一次查询时,会先去数据库查询,并将数据缓存到一级缓存中
    • 第二次去查询时,就不再去数据库中查询,直接去一级缓存中获取
    注意点:
    • 必须在同一个sqlSession
    • 多次相同的查询sql语句会直接执行一级缓存
    • 执行任意增删改操作,会清空一级缓存
    • 执行commit提交方法,也会清空一级缓存
    • MyBatis默认开启一级缓存
    延申:
    • 为什么增删改sql会清空一级缓存??
      • 为了保证缓存和数据库数据同步,不会出现脏数据的问题
    • 缓存优先级??
      • 二级缓存 --> 一级缓存 --> 数据库

    三.二级缓存

     
    二级缓存,二级缓存是Mapper级别的缓存
    说明:
    • 多个SqlSession去操作同一个Mapper的sql语句(也就是要保证多个SqlSession操作的mapper映射文件的namespace是相同的),
    • 那么多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
    注意点:
    • MyBatis需要手动开启二级缓存
    • 必须保证多个SqlSession操作的mapper的mapper映射文件是相同的
    • 执行任意增删改操作,会清空二级缓存
    • 执行commit提交方法,也会清空二级缓存
    延申:
    • 首先 全局配置文件 mybatis-configuration.xml 文件中
    1 <!--开启二级缓存  -->
    2 <settings>
    3     <setting name="cacheEnabled" value="true"/>
    4 </settings>
    • 其次 UserMapper.xml 文件中开启缓存
    1 <!-- 开启二级缓存 -->
    2 <cache></cache>
     

  • 相关阅读:
    Unity3D串口处理
    Crixalis's Equipment 杭电 (设计贪心算法,比较巧妙,我用的是结构体排序)
    杭电 看归并排序和快速排序
    杭电acm 排名 (涉及到结构体排序)
    程序在计算机的内存(看到了一篇博客,解决了我的疑惑)
    贪心算法and排序 杭电一题的启发
    辗转相除法 杭电acm
    单调队列
    用栈的思想处理字符串倒置问题更清晰
    VS的哪些事儿之二
  • 原文地址:https://www.cnblogs.com/bin563597293/p/14363359.html
Copyright © 2011-2022 走看看