MyBatis加強(1)~緩存機制(一級緩存、二級緩存、第三方緩存技術redis、ehcache)

一、緩存機制

使用緩存可以使應用更快地獲取數據,避免頻繁的數據庫交互操作,尤其是在查詢越多,緩存命中率越高 的情況下,緩存的作用就越明顯.

1、緩存原理:Map

■ 查詢時,先從緩存區查詢:找到,返回數據;找不到:到數據庫中查詢,然後把查詢的數據放進緩存,供下次使用,然後返回數據

緩存是在內存,速度肯定是比存儲在磁盤的數據庫更快,減輕數據庫的訪問壓力

2、緩存相關的概念:

(1)哪一些數據適合進行緩存:經常被查詢但是很少被修改的數據【讀遠遠大於寫操作的數據】
(2)緩存相關的屬性:

​ ■ 命中率:從緩存中查詢出來的數量佔總查詢的數量

​ ■ 最大對象數量:緩存區中最多存儲多少個數據,超出的時候可以寫到硬盤中【序列化】

​ ■ 最大空閑時間:停留在緩存空間的時間,避免出現”佔著茅坑不拉。。。”

​ ● 在MyBatis中實現緩存,只需實現Cache接口即可。

3、MyBatis 緩存【一級緩存 和 二級緩存】:

一級緩存[本地緩存,默認自動開啟,不能關閉,性能提升較差]:SqlSession級別的,每次創建新的SqlSession對象,一級緩存的空間就會發生改變。不同是SqlSession對象不可以共享數據

二級緩存[查詢緩存,需要手動開啟和配置]:mapper級別的,作用域是mapper文件的同一個namespace。二級緩存應該和namespace綁定在一起,不同是SqlSession對象可以共享數據。

● 默認的緩存是緩存到java的進程(jvm的內存空間)中,若是緩存內容過多,會出現內存溢出(OOM),需要選擇第三方的緩存技術,例如redis、ehcache。

3-1、MyBatis中一級緩存的情況:【基於SqlSession

image

■ 一級緩存【本地緩存】,默認開啟,不能關閉。
  • 好比是在SqlSession中存在一個Map,用來緩存查詢出來的對象。
■ 清空一級緩存:調用Sqlsession對象的cleanCache方法。
SqlSession session = MyBatisUtil.getSession();
//清空一級緩存
session.clearCache();
■ 一級緩存:對性能提升是有限的,每一次操作,我們都使用新的SqlSession對象,SqlSession之間不共享一級緩存。
  • 真正提升性能—->二級緩存

3-2、MyBatis中二級緩存的情況:

image

■ 使用二級緩存的步驟:

(1) 全局配置文件中啟用二級緩存

<settings>
  	<!-- 啟用二級緩存,缺省是默認啟用 -->
  	<setting name="cacheEnabled" value="true"/>
</settings>

(2) mapper文件中,使用cache元素,即namespce和緩存進行綁定:

<cache/>

(3)對於要放入二級緩存的對象要實現序列化接口【因為:超出緩存範圍的時候可以寫到硬盤中【序列化】】

public class Employee implements Serializable{

}

■ 使用二級緩存配置的一些細節(當啟用二級緩存後):

(1)mapper文件中所有select元素會默認使用緩存

(2)在大多數情況下,針對列表查詢【查詢多條數據】,設置為不緩存【useCache=”false”】,只有sql和參數相同時,才會使用到緩存:

<!-- mapper 文件-->	
<select id="listAll" resultMap="BaseResultMap" useCache="false">
	select id, name, dept_id from employee2
</select>

(3)一般,對get方法設置緩存查詢【useCache=”true”】:

<!-- mapper 文件-->	
<select id="get" resultMap="BaseResultMap" useCache="true">
	select id, name, dept_id from employee2 where id = #{id}
</select>

(4)默認情況下,insert、delete、update操作都會去刷新緩存,對於刪除和更改操作,刷新緩存操作是合理的,但是插入對象操作是沒必要刷新緩存的

<insert id="" flushCache="false">
</insert>

4、整合第三方緩存技術

4-1、EhCache:第三方的緩存技術

(1) 依賴【注意看好版本】:

□ jar包的話—方式一:可以直接在github找到對應的項目,看readme提示去下載 zip包【就包含了所需要的jar包】
□ jar包的話—方式二:到maven倉庫下載對應的jar包
  • ehcache-core.jar
  • mybais-ehcache.jar
  • slf4j-api.jar
  • slf4j-log4j.jar

(2) ehcache配置:

  • ehcache配置文件:ehcache.xml
  • 映射文件中通過cache元素的type設置為”org.mybatis.caches.ehcache.EhcacheCache”
<!-- 映射文件中使用Ehcache技術 -->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

配置好後就可以直接使用啦

4-2、redis緩存中間件:第三方的緩存技術

(1) 安裝redis服務 鏈接://github.com/MicrosoftArchive/redis/tags

(2) 依賴【注意看好版本】:

  • mybais-redis.jar

(3) redis配置:

  • ehcache配置文件:redis.properties
  • 映射文件中通過cache元素的type設置為”org.mybatis.caches.redis.RedisCache”