zoukankan      html  css  js  c++  java
  • mybatis-spring_缓存

    学习之前需要先了解一下什么是mybatis一级缓存?

    LZ推荐:https://blog.csdn.net/niunai112/article/details/80601793#%E4%B8%80%E7%BA%A7%E7%BC%93%E5%AD%98,写的很清晰
    原理图:(需要理解)

    问题1、问什么mybatis-结合spring后一级缓存失效?

    这个地方有个很重要的只是就是mybatis-4中补充的知识点,代理对象的方法其实调用的就是被代理对象的invoke方法。单独使用mybatis的时候,执行的是DefaultSqlSession类,但是当mybatis-spring结合使用的时候,用的sqlsession对象是sqlsessiontemplate,可以在里面看到invoke方法,在方法的结尾处finally中会关闭sqlsession。这才是为什么失效的原因,sqlsession关闭后一级缓存必然消失。下面我们去看一下相关源码

    直接找到MapperProxy(映射代理类)中的invoke方法。
    MapperMethod mapperMethod = this.cachedMapperMethod(method); method这个参数就是接口的类+方法(结合mybatis-4中的代码,想了解的可以看看)

    return mapperMethod.execute(this.sqlSession, args);sqlSession就是上述所说的SqlSessionTemplate

    经过上述断点进入到SqlSessionTemplate.class

    2、为什么mybatis-spring会在finally中关闭sqlsession?
    单独的mybatis是创建的sqlsession对象,随时使用随时关闭,但是bybatis-spring中使用的是SqlSessionFactoryBean创建的sqlsession,必须关闭,否者就无法关闭,因为我们使用的sqlsession是使用代理模式创建的,不关闭的话,用户无法操作这个sqlsession对象,所以必须关闭。

  • 相关阅读:
    【TECH】CAS php客户端配置
    【Tech】CAS多机部署Server和Java Client端
    【Tech】CAS RESTful API使用笔记
    【读书笔记】《Java Web整合开发实践》第3章 JSP
    MVC
    Echarts
    AutoMapper
    EntityFramework 二
    EntityFramework 一
    C# 基础复习 四 多线程
  • 原文地址:https://www.cnblogs.com/gnwzj/p/10707593.html
Copyright © 2011-2022 走看看