1. 程式人生 > >MyBatis元件之快取實現及使用

MyBatis元件之快取實現及使用

一 .概述

先講快取實現,主要是mybatis一級快取,二級快取及快取使用後續補充

Mybatis快取的實現是基於Map的,從快取裡面讀寫資料是快取模組的核心基礎功能;
除核心功能之外,有很多額外的附加功能,如:防止快取擊穿,新增快取清空策略(fifo、lru)、序列化功
能、日誌能力、定時清空能力等;
附加功能可以以任意的組合附加到核心基礎功能之上,怎麼樣優雅的為核心功能新增附加能力?使用繼承的辦法擴充套件附加功能?

繼承的方式是靜態的,使用者不能控制增加行為的方式和時機另外,新功能的存在多種組合,使用繼承可能導致大量子類存。

裝飾器模式是一種用於代替繼承的技術,無需通過繼承加子類就能擴充套件物件的新功能。使用物件的關聯關係代繼承關係,更加靈活,同時避免型別體系的快速。

 

二.設計模式

裝飾器模式uml類圖

 

舉例:IO中輸入流和輸出流的設計BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("c://a.txt"))

 

 

三.MyBatis靜態元件之快取

cache類定義了快取的一些基本操作介面。

 

cache基本操作的具體實現。

 

在快取基本實現類PerpetualCache的基礎上,建立了不同的裝飾器對快取進行了功能的增強,Java架構交流學習圈:681065582 面向具有Java開發經驗人群 幫助突破瓶頸 提升思維能力,例如BlockingCache實現的是阻塞的快取,FifoCache使用先進先出策略,ScheduledCache定時清空快取,現在以

BlockingCache為例說明mybatis快取的具體實現。

 

 

BlockingCache鎖機制可以作為一種防止快取雪崩和快取擊穿的重要手段

 CacheKey解讀

Java架構交流學習圈:681065582 面向具有Java開發經驗人群 幫助突破瓶頸 提升思維能力

 Mybatis中涉及到動態SQL的原因,快取項的key不能僅僅通過一個String來表示,所以通過CacheKey來封裝快取的Key值,CacheKey可以封裝多個影響快取項的因素;判斷兩個CacheKey是否相同關鍵是比較兩個物件的hash值是否一致;

 

Mybatis通過上述演算法確定cacheKey是否一致,Java架構交流學習圈:681065582 幫助突破瓶頸 提升思維能力,mybatis在查詢資料庫之前,回先查詢快取,同時呼叫生成cacheKey的演算法,通過下列原始碼可知影響快取的因素包括

mappedStatment的id

指定查詢結果集的範圍(分頁資訊)

查詢所使用的SQL語句

使用者傳遞給SQL語句的實際參

總結:

mybatis快取使用了裝飾器模式,對基本快取功能做了不同的程度,不同方向上的增強,同時通過cacheKey的原始碼分析,瞭解到影響快取key的因素包括

mappedStatment的id

指定查詢結果集的範圍(分頁資訊)

查詢所使用的SQL語句

使用者傳遞給SQL語句的實際參

image.png