mybatis二级缓存

1、mybatis缓存使用场景

 

2、二级缓存定义

二级缓存也称做是应用级缓存,与一级缓存不同的是它的作用范围是整个应用,而且可以跨线程使用。所以二级缓存有跟高的命中率,适合缓存一些修改较小的数据。

3、二级缓存拓展性需求

 

 

 硬盘:持久化

 第三方集成:redis等

4、装饰器+责任链实现二级缓存  屏蔽了底层复杂性

 

 

 synchronized cache装饰了后边的所有对象,一层一层嵌套,每个对象实现一个功能,所以叫责任链模式。

scheduled 是判断缓存的时间,当时间到了之后,就会清空缓存

扩展性强,可以随时在责任链中加上一个节点。

 

复制代码
    /**
     * @CacheNamespace(readWrite =false) true 序列化 false 非序列化    synchronized sche
     */
    @Test
    public void cacheTest4() {
        Cache cache = configuration.getCache("org.coderead.mybatis.UserMapper");
        User user = Mock.newUser();
        cache.putObject("zhangsan", user);// 设置缓存
        // 线程1  如果经过了序列换,两个线程读出来的对象是不同的,虽然值是相同的,这样保证了安全性。两个线程对对象的操作不会互相影响
        Object zhangsan = cache.getObject("zhangsan");
        // 线程2
        Object zhangsan = cache.getObject("zhangsan");
        System.out.println(luban==luban1);
    }
复制代码

 

 

 

 5、缓存的配置策略:

    缓存的配置策略在CacheNamespace接口中完成,也就是默认使用的责任链中的节点类。。如果需要自定义节点,只需要实现对应的接口极了

复制代码
public @interface CacheNamespace {
  Class<? extends org.apache.ibatis.cache.Cache> implementation() default PerpetualCache.class;

  Class<? extends org.apache.ibatis.cache.Cache> eviction() default LruCache.class;

  long flushInterval() default 0;

  int size() default 1024;

  boolean readWrite() default true;

  boolean blocking() default false;

  /**
   * Property values for a implementation object.
   * @since 3.4.2
   */
  Property[] properties() default {};
复制代码

自定义二级缓存配置.

 

 6、二级缓存的命中

flushcache 为true会清空所有缓存。

 

必须手动提交(commit、close)才会触发二级缓存。

复制代码
    @Test
    public void cacheTest5() {
        // 查询1
        SqlSession session1 = factory.openSession(true);
        UserMapper mapper1 = session1.getMapper(UserMapper.class);
        mapper1.selectByid3(10);// 重用执行器
      /*  // flush cache清空
        User user = mapper1.selectByid(10); //清空了,提交
        */
        session1.commit();//提交才能命中
        // 查询2
        SqlSession session2 = factory.openSession();
        UserMapper mapper2 = session2.getMapper(UserMapper.class);
        User use2 = mapper2.selectByid3(10);
    }
复制代码

7、为什么二级缓存提交之后才能命中

因为二级缓存是跨线程使用的,为了防止脏读

 

 8、二级缓存低层实现结构

 

 

 

 一个缓存区就是一个责任链。一个会话持有一个事务缓存管理器,只有当会话进行commit之后才会从暂存区提交到缓存区,也就是只有commit之后才会触发二级缓存。

9、缓存命名空间的概念

 

 一个mapper 通过@CacheNamespace来声明为一个缓存空间。

10.二级缓存执行流程

 

posted @   小南的歌  阅读(347)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示