zoukankan      html  css  js  c++  java
  • 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.二级缓存执行流程

  • 相关阅读:
    toString() 与 JSON.stringify()
    ajax+node实现图片上传
    scrollHeight与offsetHeight
    【CSS】纯css实现立体摆放图片效果
    【逻辑】赛出25匹马的前3名
    【js】数组去重时间复杂度为n的方法
    【css】css2实现两列三列布局的方法
    初始原型链(三)
    初始原型链(二)
    织梦网站后台管理网站栏目管理项不显示问题解决办法
  • 原文地址:https://www.cnblogs.com/sunanli/p/13587322.html
Copyright © 2011-2022 走看看