Spring Boot 整合 MyBatis 并启用二级缓存

        首先,MyBatis 默认是开启一级缓存的,即同一个 sqlSession 每次查询都会先去缓存中查询,没有数据的话,再去数据库获取数据。但是,整合到 Spring 中后,一级缓存就会被关闭。

        这时候我们还有二级缓存,它的范围是整个 mapper 的,以命名空间进行区分。

        Spring Boot 是号称要消灭配置的框架,底层依然还是 Spring 那些东西,主要的区别就在于,它是一个配置完整的、内置各种工具的框架,几乎所有可能的配置,它都已经进行配置了,它的配置原则是约定习惯(我们平常互相流传的使用习惯),这样,它就会覆盖大多数人所希望的配置,有手动配置需要的也可以自行配置。

        扯多了,Spring Boot 整合 MyBatis 的方式很简单,引用 Spring Boot 专门提供的包即可:

<dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.0</version>
</dependency>

        它的默认配置就是启用二级缓存的,所以这个不用我们操心。我们需要做的是在mapper.xml文件里添加二级缓存的属性配置:

<cache />

        加上这个标签,二级缓存就会启用,它的默认属性如下:

  • 映射语句文件中的所有 select 语句将会被缓存。
  • 映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
  • 缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
  • 根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序来刷新。
  • 缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
  • 缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

        也可以自定义二级缓存的属性,例如:

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

        这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会 导致冲突。

        可用的收回策略有:

  • LRU – 最近最少使用的:移除最长时间不被使用的对象。
  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  • SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
  • WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

        默认的是 LRU。

        flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒 形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。

        size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的 可用内存资源数目。默认值是 1024。

        readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓 存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存 会返回缓存对象的拷贝(通过序列化) 。这会慢一些,但是安全,因此默认是 false。

猜你喜欢

转载自my.oschina.net/watsonos/blog/1636186