简介 目录 评价 推荐
  • 临风流烟 2023-05-05

    SqlSession继承路径


    0赞 · 0采集
  • 魔都小码农 2022-10-30

    缓存比较

    0赞 · 0采集
  • 魔都小码农 2022-10-30


    Rediscache

    0赞 · 0采集
  • 魔都小码农 2022-10-30

    summary

    0赞 · 0采集
  • 魔都小码农 2022-10-29

    cache

    0赞 · 0采集
  • ITLover 2022-04-25

    Mybatis Cache

    一级缓存特点

    自动启用

    通过在setting中设置localCacheScope= STATEMENT(默认为SESSION)全局禁用一级缓存

    在Dao接口方法上添加注解:@Options(flushCache=Options.FlushCachePolicy.True),禁用这个方法的一级缓存

    命中原则,同一SqlSession内,以下5个条件组成key,放入缓存中:

    条件一:statementId相同

    条件二:sql上用到的参数要一样

    条件三:分页参数要一样 

    条件四:sql语句的文本要一样

    条件五:数据库连接的environment要一样

    生命周期

    产生:sqlSession执行查询方法,而不是update等

    销毁:sqlSession关闭、sqlSession提交、sqlSession回滚、sqlSession执行update(新增、删除、更新)后底层会执行清除、主动清除

    辟谣:Mybatis 一级缓存脏读(数据被另外事务修改并提交后,仍会从缓存中读到旧数据(错误),实际是避免了事务不可重复读问题), Mybatis 一级缓存是在事务的生命周期之内的,在关闭session、执行commit、执行rollback都会清空Mybatis一级缓存。 实际上Mybatis 一级缓存反而避免了数据库事务中的脏读(读未提交)、不可重复读(读提交)问题。

    源码解读

    代理模式与装饰模式的区别:代理模式在无参构造方法中确定地new了一个被代理的对象,编译时已经可以确定;而装饰模式是通过有参构造方法将被装饰对象传入装饰 类中,能够在运行时递归地被构造。

    设计理念:在一个session内,不过期、不更新、不限制;

    与spring整合时,如果开启了事务,事务内,Spring通过ThreadLocal始终使用同一个sqlSession,一级缓存生效; 如果没有开启事务,每次查询前会创建一个sqlSession,查询结束后会关闭sqlSession,所以一级缓存无效; 

    二级缓存特点(跨sqlSession、有脏读问题,建议直接不用)

    启用步骤:

    在mybatis.xml中settings标签下添加; 

    在mapper.xml中mapper标签下添加:属性eviction(LRU( 默认)、FIFO、SOFT、WEAK)和size(实例数,默认不限制),通过这两个属性可自定义二级缓存的清除策略

    在mapper.xml中mapper标签下添加:属性type,通过设置type可以指定使用的Cache对象,后面自定义缓存中有用到

    默认地,select标签flushCache="false" useCache="true",其他标签flushCache="true" entity类实现Serializable标记类; 

    命中原则,同一SqlSessionFactory内,以下5个条件组成key,放入缓存中: 

    条件一:statementId相同 

    条件二:sql上用到的参数要一样 

    条件三:分页参数要一样 

    条件四:sql语句的文本要一样 

    条件五:数据库连接的environment一样 

    生命周期 

    sqlSession关闭-创建二级缓存、 

    sqlSession提交-创建二级缓存、

    sqlSession回滚、

    sqlSession执行update(新增、删除、更新)、销毁二级缓存唯方法:同一mapper.xml执行update(新增、删除、更新)注意:同一个表的操作要放在同一个mapper下

    sqlSession主动清除

    产生:1.能产生一级缓存;2.对sqlSession进行关闭或提交; 

    销毁:

    源码解读 (MapperBuilderAssistant.class->useNewCache、XMLMapperBuilder.class->cacheElement)

    缓存是存在Configuration下并且缓存使用的是PerpetualCache(非分布式),而Configuration又是在DefaultSqlSessionFactory下,所以不同的SqlSessionFactory下的缓存是相互隔离的;

    通过自定义Redis缓存(实现Cache),将mapper下的cache指定type为自定义的类,就可以实现缓跨DefaultSqlSessionFactory;

    0赞 · 0采集
  • AppMan 2022-04-07

    课程目录

    0赞 · 1采集
  • 慕粉2150139517 2021-12-26

    mybatis一级缓存类图。


    0赞 · 1采集
  • 慕粉2150139517 2021-12-26

    mhsql一级缓存类图


    0赞 · 0采集
  • 慕哥9020169 2021-12-14

    哈哈哈哈

    0赞 · 0采集
  • zzZeroll 2021-08-22

    mybatis一二级缓存


    0赞 · 0采集
  • WE_Xing 2021-08-18

    MyBatis

    0赞 · 0采集
  • WE_Xing 2021-08-17

    MyBatis

    0赞 · 0采集
  • WE_Xing 2021-08-17

    MyBatis


    0赞 · 0采集
  • WE_Xing 2021-08-12

    MyBatis

    0赞 · 0采集
  • weixin_慕标0368495 2021-06-07

    http://img.mukewang.com/60bd7cb20001a66308220481.jpg

    11

    0赞 · 0采集
  • 慕粉1416052779 2020-12-22

    二级缓存的命中原则

    http://img.mukewang.com/5fe176a5000139d712240683.jpg

    0赞 · 1采集
  • 慕粉1416052779 2020-12-22


    1、修改配置文件

    2、修改mapper文件

    3、实体类实现序列化接口

    http://img3.mukewang.com/5fe173c80001baf412020666.jpg


    0赞 · 1采集
  • 慕粉1416052779 2020-12-22

    MyBatis与Spring继承:一级缓存

    http://img.mukewang.com/5fe16937000100e912660697.jpg

    截图
    0赞 · 0采集
  • 慕粉1416052779 2020-12-22

    一级缓存的存储

    http://img.mukewang.com/5fe158a50001e03919201080.jpg

    截图
    0赞 · 0采集
  • 慕粉1416052779 2020-12-21

    MyBatis是怎么判断某两次查询是完全相同的查询?

    条件一:要求查询的StatementId必须相同,否则无法命中缓存,即使两个查询语句、参数等完全一样。

    条件二:要求传递给SQL的查询参数必须相同,否则无法命中缓存

    条件三:要求分页参数必须相同,否则无法命中缓存。缓存粒度是整个分页查询结果,而不是结果中的每个对象。

    条件四:要求传递给JDBC的SQL必须完全相同。

    条件五:要求执行环境必须相同。

    http://img4.mukewang.com/5fe04b930001874810590518.jpg

    截图
    0赞 · 1采集
  • 旅行的癞蛤蟆 2020-12-16

    http://img1.mukewang.com/5fda0e0f0001fe6d10840589.jpgmybatis缓存比较

    0赞 · 0采集
  • 旅行的癞蛤蟆 2020-12-13

    size引用数目

    缓存引用的最大数目,默认是1024

    当缓存引用达到最大数目时,按照eviction设定的策略执行清除。

    0赞 · 0采集
  • 旅行的癞蛤蟆 2020-12-13

    eviction清除策略:

    LRU:最近最少使用:移除最长时间不被使用的对象;(LinkHashMap)

    FIFO:先进先出:按对象进入缓存的顺序来移除它们;(LinkedList)

    SOFT:软引用:基于GC和软引用规则移除对象;(SoftReference)

    WEAK:弱引用: 基于GC和弱引用规则移除对象;(WeakReference)

    0赞 · 1采集
  • 旅行的癞蛤蟆 2020-12-13

    二级缓存什么时候产生?

    1. 要满足一级缓存的产生条件(select)

    2. close session 或者commit session。rollback不能缓存。

      缓存的产生:


    什么时候销毁?

    一级缓存:session关闭、commit提交、rollback回滚、update更新、clearcache清除。

    二级缓存:session关闭(创建二级缓存)、

    commit提交(创建二级缓存)、update更新(销毁二级缓存,当前mapper文件里面的)


    0赞 · 0采集
  • 旅行的癞蛤蟆 2020-12-13

    二级缓存是同一SqlSessionFactory内。其缓存条件和一级缓存一样。

    0赞 · 0采集
  • 旅行的癞蛤蟆 2020-12-12

    一级缓存设计理念:

    在一个Session内,不更新缓存,直接清空缓存。只有SqlSession不关闭,就不会过期。不限制

    0赞 · 0采集
  • 旅行的癞蛤蟆 2020-12-12
    可以通过SqlSession.clearCahe主动清空缓存
    截图
    0赞 · 0采集
  • 旅行的癞蛤蟆 2020-12-12
    Update也会清空缓存,与表无关
    截图
    0赞 · 0采集
  • 旅行的癞蛤蟆 2020-12-12
    事务提交会清空缓存 事务回滚也会清空缓存
    截图
    0赞 · 0采集
数据加载中...
开始学习 免费