日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql ehcache_MyBatis使用Ehcache作为二级缓存

發(fā)布時間:2023/12/15 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql ehcache_MyBatis使用Ehcache作为二级缓存 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

特別說明:由于二級緩存是基于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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。