天天看點

Mybatis緩存

作者:奮發雲朵ft

Mybatis緩存

MyBatis的一級緩存

一級緩存是SqlSession級别的,通過同一個SqlSession查詢的資料會被緩存,下次查詢相同的資料,就會從緩存中直接擷取,不會從資料庫重新通路

使一級緩存失效的四種情況:

  1. 不同的SqlSession對應不同的一級緩存
  2. 同一個SqlSession但是查詢條件不同
  3. 同一個SqlSession兩次查詢期間執行了任何一次增删改操作
  4. 同一個SqlSession兩次查詢期間手動清空了緩存

MyBatis的二級緩存

二級緩存是SqlSessionFactory級别,通過同一個SqlSessionFactory建立的SqlSession查詢的結果會被緩存;此後若再次執行相同的查詢語句,結果就會從緩存中擷取

二級緩存開啟的條件:

a>在核心配置檔案中,設定全局配置屬性cacheEnabled="true",預設為true,不需要設定

b>在對應xxxxMapper.xml映射檔案中的mapper内部直接寫它就行,設定标簽

<cache />           

注意實體類上要加上序列化:implements Serializable

public class admin implements Serializable           

這樣我們使用查詢時查詢第一次控制台正常列印SQL語句,而進行第二次查詢時,如果沒有加上這個cache,那麼還是正常列印SQL語句,加上cache就會提示,而不會去列印SQL,說明緩存找到了

Mybatis緩存

二級緩存的相關配置

基本不用去配置

<cache blocking="" flushInterval="" size="" eviction="" readOnly="" type=""/>           

在mapper配置檔案中添加的cache标簽可以設定一些屬性:

  • eviction屬性:緩存回收政策
  • LRU(Least Recently Used) – 最近最少使用的:移除最長時間不被使用的對象。
  • FIFO(First in First out) – 先進先出:按對象進入緩存的順序來移除它們。
  • SOFT – 軟引用:移除基于垃圾回收器狀态和軟引用規則的對象。
  • WEAK – 弱引用:更積極地移除基于垃圾收集器狀态和弱引用規則的對象。
  • 預設的是 LRU。
  • flushInterval屬性:重新整理間隔,機關毫秒。預設情況是不設定,也就是沒有重新整理間隔,緩存僅僅調用語句時重新整理
  • size屬性:引用數目,正整數。代表緩存最多可以存儲多少個對象,太大容易導緻記憶體溢出
  • readOnly屬性:隻讀,true/false
  • true:隻讀緩存;會給所有調用者傳回緩存對象的相同執行個體。是以這些對象不能被修改。這提供了很重要的性能優勢。
  • false:讀寫緩存;會傳回緩存對象的拷貝(通過序列化)。這會慢一些,但是安全,是以預設是false

MyBatis緩存查詢的順序

  • 先查詢二級緩存,因為二級緩存中可能會有其他程式已經查出來的資料,可以拿來直接使用。
  • 如果二級緩存沒有命中,再查詢一級緩存
  • 如果一級緩存也沒有命中,則查詢資料庫
  • SqlSession關閉之後,一級緩存中的資料會寫入二級緩存

整合第三方緩存EHCache

添加依賴

<!-- Mybatis EHCache整合包 -->
 <dependency>
     <groupId>org.mybatis.caches</groupId>
     <artifactId>mybatis-ehcache</artifactId>
     <version>1.2.2</version>
 </dependency>
 <!-- 下面這個日志檔案依賴可以不加 -->
 <!-- slf4j日志門面的一個具體實作 -->
 <dependency>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-classic</artifactId>
     <version>1.2.3</version>
 </dependency>           

在resource目錄下建立EHCache的配置檔案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">
     <!-- 磁盤儲存路徑 -->
     <diskStore path="D:\360yasuo"/>
     <defaultCache
             maxElementsInMemory="1000"
             maxElementsOnDisk="10000000"
             eternal="false"
             overflowToDisk="true"
             timeToIdleSeconds="120"
             timeToLiveSeconds="120"
             diskExpiryThreadIntervalSeconds="120"
             memoryStoreEvictionPolicy="LRU">
     </defaultCache>
 </ehcache>           

在xxxxMapper.xml中引入

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>           

加入logback日志

存在SLF4J時,作為簡易日志的log4j将失效,此時我們需要借助SLF4J的具體實作logback來列印日志。

在resource目錄下建立logback的配置檔案logback.xml

<?xml version="1.0" encoding="UTF-8"?>
 <configuration debug="true">
     <!-- 指定日志輸出的位置 -->
     <appender name="STDOUT"
               class="ch.qos.logback.core.ConsoleAppender">
     <encoder>
     <!-- 日志輸出的格式 -->
     <!-- 按照順序分别是:時間、日志級别、線程名稱、列印日志的類、日志主體内容、換行
     -->
     <pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
     </encoder>
     </appender>
     <!-- 設定全局日志級别。日志級别按順序分别是:DEBUG、INFO、WARN、ERROR -->
     <!-- 指定任何一個日志級别都隻列印目前級别和後面級别的日志。 -->
     <root level="DEBUG">
         <!-- 指定列印日志的appender,這裡通過“STDOUT”引用了前面配置的appender -->
         <appender-ref ref="STDOUT" />
     </root>
     <!-- 根據特殊需求指定局部日志級别 -->
     <logger name="com.atguigu.crowd.mapper" level="DEBUG"/>
 </configuration>           

EHCache配置檔案說明即:ehcache.xml

Mybatis緩存

繼續閱讀