MyBatis笔记(七)

作者: linzeliang
  1. 简介

  2. 什么是缓存?

  3. 存在内存中的临时数据

  4. 将用户经常查询的数据存放在缓存(内存)中,用户取查询就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题

  5. 为什么使用缓存?

  6. 减少和数据库交互的次数

  7. 什么样的数据能使用缓存?

  8. 经常查询并且不经常改变的数据

  9. MyBatis缓存

  10. MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存,缓存可以极大地提升查询效率

  11. MyBatis系统中默认定义了两级缓存:一级缓存二级缓存

  12. 默认情况下,只有一级缓存开启(SqlSession级别地缓存,也称为本地缓存)

  13. 二级缓存需要手动开启和配置,它是基于namespace级别的缓存

  14. 为了提高扩展性,MyBatis定义了缓存接口Cache,们可以通过实现Cache接口来自定义二级缓存

  15. 一级缓存

  16. 一级缓存是默认开启的

  17. 一级缓存也叫本地缓存:

  18. 与数据库同一次会话期间查到的数据会放在本地缓存中

  19. 以后如果要获取相同的数据,直接从缓存中拿,不用再去查询数据库了

  20. 一级缓存是SqlSession级别的缓存,是一直开启的,们关闭不了它

  21. 一级缓存失效结果:查询相同的数据仍需再次发起一次查询请求

  22. 一级缓存失效的四种情况:

  23. sqlSession不同:每个sqlSession中的缓存相互独立

  24. sqlSession相同,查询条件不同

  25. sqlSession相同,两次查询之间执行了增删改操作

  26. sqlSession相同,手动清楚一级缓存(使用谢列语句可以清除缓存)

     session.clearCache();
    
  27. 一级缓存就是一个map

  28. 二级缓存

  29. 二级缓存也叫全局缓存,一级缓存作用域太低了,所以产生了二级缓存

  30. 基于namespace级别的缓存,一个名称空间对应一个二级缓存

  31. 工作机制:

  32. 一个会话查询一个数据,这个数据就会被放在当前会话的一级缓存中。如果当前会话关闭了,这个会话对应的一级缓存就没了。但是们想要的是会话关闭了,一级缓存中的数据被保存到二级缓存中,新的会话查询信息,就可以从二级缓存中获取内容,不同mapper查出的数据会藏在自己对应的缓存(map)中

  33. 开启二级缓存步骤:

  34. 开启全局缓存mybatis-config.xml

     <setting name="cacheEnabled" value="true"/>
    
  35. 去每个mapper.xml中配置使用二级缓存

     <cache/>
    
     官方示例=====>查看官方文档
     <cache
       eviction="FIFO"
       flushInterval="60000"
       size="512"
       readOnly="true"/>
     <!-- 这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突。 -->
    
  36. 总结:

  37. 只要开启了二级缓存,们在同一个mapper中的查询,可以在二级缓存中拿到数据

  38. 查出的数据都会默认先放在一级缓存中

  39. 只有会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中

  40. 缓存原理

  41. 缓存原理图

    image-20210417000738269

  42. EhCache

  43. 第三方缓存的实现 —— EhCache

  44. EhCache是一种广泛使用的Java分故事缓存,用于通用缓存

  45. 在应用程序中使用EhCache

  46. 引入依赖jar包

    <!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
    <dependency>
        <groupId>org.mybatis.caches</groupId>
        <artifactId>mybatis-ehcache</artifactId>
        <version>1.1.0</version>
    </dependency>
    
  47. 在mapper配置文件中使用对应的缓存即可

    <mapper namespace = "org.acme.FooMapper" > 
        <cache type = "org.mybatis.caches.ehcache.EhcacheCache" /> 
    </mapper>
    
  48. 编写ehcache.xml文件,如果在加载时未找到/ehcache.xml资源或者出现问题,则将使用默认配置

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
             updateCheck="false">
        <!--
           diskStore:为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。参数解释如下:
           user.home -- 用户主目录
           user.dir  -- 用户当前工作目录
           java.io.tmpdir -- 默认临时文件路径
         -->
        <diskStore path="./tmpdir/Tmp_EhCache"/>
    
        <defaultCache
                      eternal="false"
                      maxElementsInMemory="10000"
                      overflowToDisk="false"
                      diskPersistent="false"
                      timeToIdleSeconds="1800"
                      timeToLiveSeconds="259200"
                      memoryStoreEvictionPolicy="LRU"/>
    
        <cache
               name="cloud_user"
               eternal="false"
               maxElementsInMemory="5000"
               overflowToDisk="false"
               diskPersistent="false"
               timeToIdleSeconds="1800"
               timeToLiveSeconds="1800"
               memoryStoreEvictionPolicy="LRU"/>
        <!--
           defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。
         -->
        <!--
          name:缓存名称。
          maxElementsInMemory:缓存最大数目
          maxElementsOnDisk:硬盘最大缓存个数。
          eternal:对象是否永久有效,一但设置了,timeout将不起作用。
          overflowToDisk:是否保存到磁盘,当系统当机时
          timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
          timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
          diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
          diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
          diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
          memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
          clearOnFlush:内存数量最大时是否清除。
          memoryStoreEvictionPolicy:可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。
          FIFO,first in first out,这个是大家最熟的,先进先出。
          LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
          LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
       -->
    
    </ehcache>
    

原文创作:linzeliang

原文链接:https://www.cnblogs.com/linzeliang1222/p/14669338.html

更多推荐

更多
  • 程序计数器 M78 程序计数器简述特点作用似之处,都是取下一次的指令地址。 * PC Register在JVM里可以翻译成program counter register 程序计数器,在JVM里只存储当前执行的操作码的地址。也算是对CPU里寄存器的一种模拟
  • Java EE 学习 79 下 - 动态SQL - mybatis和spring的整合 - 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】一、动态SQL二、mybatis和spring的整合三、进行测试即可,测试使用的DAO/Service等在项目中。  1.动态SQL之多条件查询  2
  • 魔改swagger:knife4j的另外一种打开方式 魔改swagger:knife4j的另外一种打开方式一、两种文档聚合模式二、swagger-ui的实现原理三、swagger-register-server四、swagger-spring-boot-starter五、实战六、其它问题原
  • 二叉树题解方法 二叉树-题解-方法递归二叉树的递归遍历二叉树的迭代遍历二叉树的统一迭代法二叉树的层序遍历翻转二叉树对称二叉树二叉树的最大深度二叉树的最小深度慢就是快!递归法迭代法递归法迭代法迭代法n叉树的最大深度使用队列使用栈/15056076.htm
  • 字符串题解方法 字符串-题解-方法反转字符串反转字符串II替换空格翻转字符串左旋转字符串实现 strStr()重复的子字符串慢就是快!KMP算法KMP有什么用什么是前缀表时间复杂度分析代码,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题
  • Hash题解方法 Hash-题解-方法有效的字母异位词两个数组的交集快乐数两数之和四数相加II赎金信三数之和慢就是快!m", t = "nagaram" 输出: true 示例 2: 输入: s = "rat", t = "car" 输出: false
  • 链表题解 链表-题解移除链表元素翻转指针两两交换链表中的节点删除链表的倒数第N个节点链表相交环形链表II慢就是快!双指针法递归实现判断链表是否有环bo/2020/2465789-20210910160233590-1213910246.png)
  • 双指针题解 双指针-题解移除元素慢就是快!数组空间,你必须仅使用 O(1) 额外空间并**原地**修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例 1: 给定 nums = \[3,2,2,3\], ​ va
  • SprinBootSpringData整合 SprinBoot-SpringData-整合SpringData整合JDBC整合Druid整合MyBatis整合Redis慢就是快!JDBCTemplate配置数据源配置Druid数据源监控整合测试测试整合序列化配置自定义redisT
  • 刷题加油 刷题-加油推荐刷题网址方式慢就是快!ub中有好指导](https://programmercarl.com/) 想进大厂的朋友,建议刷够250-300题。 建议中等难度的占比不低于80%,简单的不超过10%。 另外选题类型尽量全面
  • 近期文章

    更多
    文章目录

      推荐作者

      更多