Mybatis緩存
MyBatis的一級緩存
一級緩存是SqlSession級别的,通過同一個SqlSession查詢的資料會被緩存,下次查詢相同的資料,就會從緩存中直接擷取,不會從資料庫重新通路
使一級緩存失效的四種情況:
- 不同的SqlSession對應不同的一級緩存
- 同一個SqlSession但是查詢條件不同
- 同一個SqlSession兩次查詢期間執行了任何一次增删改操作
- 同一個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,說明緩存找到了
二級緩存的相關配置
基本不用去配置
<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