1. 程式人生 > >Mybatis整合第三方快取ehcache

Mybatis整合第三方快取ehcache

第三方快取主要是來壯大Mybatis的二級快取。

Mybatis整合第三方快取原理圖:

解讀:

1、客戶從資料庫獲取資料視為一次會話,抽象為sqlSession物件

2、一個Excutor包含增刪改查的操作;

3、CachingExcutor是對Excutor的包裝,此處相當於代理模式

4、當有會話時,先訪問CachingExcutor物件,CachingExcutor先從二級快取查詢資料,如果有就直接返回;如果沒有,就進入Excutor的一級快取,如果還是沒有就執行Excutor的增刪改查返回結果,並將結果儲存至快取中,同一個sqlSession再次訪問就可以從一級快取中取了;

5、由於mybatis的快取只用了map實現,所以mybatis允許快取由第三方快取來實現,並定義了cache介面,第三方只要實現該介面即可,和mybatis整合在一起後由mybatis在程式中進行呼叫;

一、下載相關jar包

1、下載ehcache原始碼包

下載地址:https://mvnrepository.com/artifact/net.sf.ehcache/ehcache-core/2.6.8

或者,用maven匯入:

<!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache-core -->
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache-core</artifactId>
    <version>2.6.8</version>
</dependency>

如圖:

2、下載其依賴的日誌包sl4j

2.1  下載slf4j-api.jar包

https://mvnrepository.com/artifact/org.slf4j/slf4j-api/1.7.25

或者maven配置:

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>

2.2 下載slf4j-log4j12.jar包

https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12

或者maven配置:

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.25</version>
    <scope>test</scope>
</dependency>

如圖:

3、下載mybatis和ehcache的適配包

方式一:github上下載

https://github.com/mybatis/ehcache-cache/releases

 方式二:maven倉庫中下載

https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache/1.0.3

方式三:maven配置自動匯入

<!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.0.3</version>
</dependency>

如圖:

4、還需要一個ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
 <!-- 磁碟儲存路徑 -->
 <diskStore path="D:\44\ehcache" />
 
 <defaultCache 
   maxElementsInMemory="1" 
   maxElementsOnDisk="10000000"
   eternal="false" 
   overflowToDisk="true" 
   timeToIdleSeconds="120"
   timeToLiveSeconds="120" 
   diskExpiryThreadIntervalSeconds="120"
   memoryStoreEvictionPolicy="LRU">
 </defaultCache>
</ehcache>
 
<!-- 
屬性說明:
l diskStore:當記憶體中不夠儲存時,儲存到指定資料在磁碟中的儲存位置。
l defaultCache:當藉助CacheManager.add("demoCache")建立Cache時,EhCache便會採用<defalutCache/>指定的的管理策略
 
以下屬性是必須的:
l maxElementsInMemory - 在記憶體中快取的element的最大數目 
l maxElementsOnDisk - 在磁碟上快取的element的最大數目,若是0表示無窮大
l eternal - 設定快取的elements是否永遠不過期。如果為true,則快取的資料始終有效,如果為false那麼還要根據timeToIdleSeconds,timeToLiveSeconds判斷
l overflowToDisk - 設定當記憶體快取溢位的時候是否將過期的element快取到磁碟上
 
以下屬性是可選的:
l timeToIdleSeconds - 當快取在EhCache中的資料前後兩次訪問的時間超過timeToIdleSeconds的屬性取值時,這些資料便會刪除,預設值是0,也就是可閒置時間無窮大
l timeToLiveSeconds - 快取element的有效生命期,預設是0.,也就是element存活時間無窮大
 diskSpoolBufferSizeMB 這個引數設定DiskStore(磁碟快取)的快取區大小.預設是30MB.每個Cache都應該有自己的一個緩衝區.
l diskPersistent - 在VM重啟的時候是否啟用磁碟儲存EhCache中的資料,預設是false。
l diskExpiryThreadIntervalSeconds - 磁碟快取的清理執行緒執行間隔,預設是120秒。每個120s,相應的執行緒會進行一次EhCache中資料的清理工作
l memoryStoreEvictionPolicy - 當記憶體快取達到最大,有新的element加入的時候, 移除快取中element的策略。預設是LRU(最近最少使用),可選的有LFU(最不常使用)和FIFO(先進先出)
 -->

二、整合mybatis

1、將準備好的jar包和xml匯入到專案中

2、mapper.xml中使用自定義快取

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.mybatis.dao.EmployeeMapper">

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

 	<!--public Map<Integer, Employee> getEmpByLastNameLikeReturnMap(String lastName);  -->
 	<select id="getEmpByLastNameLikeReturnMap" resultType="com.atguigu.mybatis.bean.Employee">
 		select * from tbl_employee where last_name like #{lastName}
 	</select>
</mapper>

3、測試

@Test
public void testSecondLevelCache() throws IOException{
	SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
	SqlSession openSession = sqlSessionFactory.openSession();
	SqlSession openSession2 = sqlSessionFactory.openSession();
	try{

		EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
		EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);
		
		Employee emp01 = mapper.getEmpById(1);
		System.out.println(emp01);
		openSession.close();
		
		//第二次查詢是從二級快取中拿到的資料,並沒有傳送新的sql
		Employee emp02 = mapper2.getEmpById(1);
		System.out.println(emp02);
		openSession2.close();
		
	}finally{
		
	}
}

結果:

說明:只查詢了一次sql,所以第二次訪問是從ehcache快取中拿的,

並且在D:\44\ehcache目錄下也會有相關資料:

注: 如果其他mapper.xml需要使用快取,可進行引用mapper

<!-- 引用快取:namespace:指定和哪個名稱空間下的快取一樣 -->

<cache-ref namespace="com.atguigu.mybatis.dao.EmployeeMapper"/>