mysql ehcache_MyBatis使用Ehcache作为二级缓存
特別說明:由于二級緩存是基于Mapper的,當(dāng)你在不同的mapper中查詢了相同的數(shù)據(jù),例如不同的Mapper中有多表查詢時結(jié)果中有相同的數(shù)據(jù),當(dāng)其中一個Mapper進(jìn)行插入更新緩存時,另一個并沒有插入更新,那么使用兩個mapper查詢出來的數(shù)據(jù)會出現(xiàn)數(shù)據(jù)不一致的情況,所以MyBatis默認(rèn)的二級緩存的實(shí)現(xiàn)方式需要慎用,也因此MyBatis的二級緩存都默認(rèn)關(guān)閉。
主要步驟(基于springboot+mybatis)
1 導(dǎo)入依賴
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2
mysql
mysql-connector-java
5.1.8
org.mybatis.caches
mybatis-ehcache
1.1.0
2 開啟全局緩存
開啟全局配置
3 配置ehcache.xml
注意:ehcache.xml必須放在classpath路徑下,并且名字必須是ehcache.xml(因?yàn)镃acheManager默認(rèn)就是加載classpath路徑下的ehcache.xml文件,當(dāng)然也可以自己設(shè)置,這就需要自己繼承EhcacheCache自己寫邏輯)
maxElementsInMemory="10000"
maxElementsOnDisk="0"
eternal="true"
overflowToDisk="true"
diskPersistent="true"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
diskSpoolBufferSizeMB="50"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LFU"
/>
name="user_cache"
maxElementsInMemory="5000"
overflowToDisk="false"
diskPersistent="true"
timeToIdleSeconds="1800"
timeToLiveSeconds="1800"
memoryStoreEvictionPolicy="LRU"/>
這里最重要的就是默認(rèn)緩存配置,因?yàn)镃acheManager.addCache(name)添加的緩存就是通過默認(rèn)配置創(chuàng)建的,具體每個屬性代表的意思可以查詢Ehcache的屬性配置,網(wǎng)上很多,這里不細(xì)述。
4 在mapper中開啟緩存并指定使用Ehcache
在一個mapper中通過以下代碼添加緩存。
假設(shè)通過引入緩存的mapper的namespache為“com.dahuici.zyb.Dao.UserDao”,其他mapper可以通過如下標(biāo)簽與其共享緩存。
通過與配合使用,可以讓所有的mapper都共用一個緩存。
特別提示,如果使用的是mybatis-plus,使用上面的步驟配置的話,會發(fā)現(xiàn)調(diào)用mybatis-plus已經(jīng)封裝好的api,緩存無效,只有自己在mapper中定義的sql方法才有效。個人理解就是這些api是mybatis-plus自己封裝好的,封裝的時候沒有開啟緩存,解決辦法是如下,在dao層使用注解引用其他mapper的緩存,共享緩存
mybatis-plus共享緩存
EhcacheCache源代碼研究
public class EhcacheCache extends AbstractEhcacheCache {
public EhcacheCache(String id) {
super(id);
if (!CACHE_MANAGER.cacheExists(id)) {
//根據(jù)默認(rèn)配置創(chuàng)建緩存
CACHE_MANAGER.addCache(id);
}
this.cache = CACHE_MANAGER.getEhcache(id);
}
}
對于mybatis,也可以自定義緩存,只需實(shí)現(xiàn)org.apache.ibatis.cache接口,需要注意的是必須要有一個傳入String類型的一個構(gòu)造方法,mybatis會自動調(diào)用并將namespace的值作為id傳入。
package org.apache.ibatis.cache;
import java.util.concurrent.locks.ReadWriteLock;
public interface Cache {
//獲取緩存id
String getId();
//往緩存中放入對象
void putObject(Object key, Object value);
//獲取對象
Object getObject(Object key);
//移除對象
Object removeObject(Object key);
//清除緩存數(shù)據(jù)
void clear();
//獲取緩存尺寸
int getSize();
//獲取讀寫鎖
ReadWriteLock getReadWriteLock();
}
總結(jié)
以上是生活随笔為你收集整理的mysql ehcache_MyBatis使用Ehcache作为二级缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米13 Ultra真机曝光 神似前代U
- 下一篇: mysql mongo关联查询语句_Mo