Mybatis二級快取

2021-09-01 21:58:35 字數 1836 閱讀 7411

原文找不到了,如果作者看到了可以留下位址,我再加上引用

sqlsession2去查詢使用者id為1的使用者資訊,去快取中找是否存在資料,如果存在直接從快取中取出資料。

明白了mybatis中二級快取的原理後,接下來就是如何使用二級快取了。在使用之前,首先得開啟二級快取的開關。

2.1 開啟二級快取

2.2 將po類實現serializable介面

開啟了二級快取後,還需要將要快取的pojo實現serializable介面,為了將快取資料取出執行反序列化操作,因為二級快取資料儲存介質多種多樣,不一定只存在記憶體中,有可能存在硬碟中,如果我們要再取這個快取的話,就需要反序列化了。所以建議mybatis中的pojo都去實現serializable介面。下面以user為例截個圖: 

2.3 測試mybatis的二級快取

@test

public void testcache2() throws exception

我們先把sqlsession3部分注釋掉來測試一下二級快取的結果: 

當我們把sqlsession3部分加上後,再測試一下二級快取結果: 

到這裡,就明白了mybatis中二級快取的執行原理了,這個跟hibernate還是有點像的。

2.4 其他配置(usecache和flushcache)

mybatis中還可以配置usecache和flushcache等配置項,usecache是用來設定是否禁用二級快取的,在statement中設定usecache=false可以禁用當前select語句的二級快取,即每次查詢都會發出sql去查詢,預設情況是true,即該sql使用二級快取。

一般下執行完commit操作都需要重新整理快取,flushcache=true表示重新整理快取,這樣可以避免資料庫髒讀。所以我們不用設定,預設即可,這裡只是提一下。

3.1 問題的由來

上面的部分主要總結了一下mybatis中二級快取的使用,但是mybatis中預設自帶的二級快取有個弊端,即無法實現分布式快取,什麼意思呢?就是說快取的資料在本地的伺服器上,假設現在有兩個伺服器a和b,使用者訪問的時候訪問了a伺服器,查詢後的快取就會放在a伺服器上,假設現在有個使用者訪問的是b伺服器,那麼,他在b伺服器上就無法獲取剛剛那個快取,如下圖所示: 

所以我們為了解決這個問題,就得找乙個分布式的快取,專門用來儲存快取資料的,這樣不同的伺服器要快取資料都往它那裡存,取快取資料也從它那裡取,如下圖所示: 

這樣就能解決上面所說的問題,為了提高系統併發效能、我們一般對系統進行上面這種分布式部署(集群部署方式),因此要使用分布式快取對快取資料進行集中管理。但是mybatis無法實現分布式快取,需要和其它分布式快取框架進行整合,這裡主要介紹ehcache。

3.2 整合方法

這裡面配置的作用跟hibernate差不多,大家可以去參考我那篇hibernate二級快取的博文。接下來就是測試了,還是用上面的那個測試程式,因為只改掉了快取,其他沒動。到此為止,mybatis的二級快取差不多就總結完了。

mybatis二級快取

配置檔案 不用配置也是預設開啟的 在sqlmapconfig.xml中 cacheenabled value true 如果不需要二級快取,可以在設定禁用二級快取 select 這樣每次都是從資料庫中讀取 在執行insert,update,delete後會重新整理快取 清空快取 可以設定不重新整理 ...

mybatis 二級快取

一 mybatis 二級快取 3 mybatis 預設二級快取未開啟 內建是支援二級快取的。但是由於本身是資料庫管理元件 所以快取並不好用 所以還是要用第三方的快取機制。典型的 ehcache 二 二級快取的常見演算法 lru least recently used 這種演算法是在每個物件中維護乙個...

mybatis 二級快取

配置 預設值是true,所以若設定值為true時可以不配置 mybatis.configuration.cache enabled true使用 cachenamespace 屬性 eviction 策略,預設lrucache 最近最少使用演算法,使用時間距離現在最久的那個被移除 fifocache...