您好,登錄后才能下訂單哦!
本篇內容介紹了“mybatis和ehcache怎么實現緩存”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
緩存的概念
java里緩存可以分兩種情況,一種是JVM的緩存,這個是JVM與操作系統打交道用的,在使用java語言開發時,一般不用到。
一種是java語言緩存,這里的緩存是一種機制,不與任何硬件相關。比如一個 static的變量, 當第一次訪問他時我們到文件里讀他的值,以后訪問時,直接把這個值返回去,這里省下了IO的時間,提高了效率,這就是一個簡單的緩存機制。
一級緩存
一級緩存是SqlSession級別的緩存。在操作數據庫時需要構造sqlSession對象,在對象中有一個數據結構用于存儲緩存數據。不同的sqlSession之間的緩存數據區域是互相不影響的。也就是他只能作用在同一個sqlSession中,不同的sqlSession中的緩存是互相不能讀取的。
處理流程:
用戶發起查詢請求,查找某條數據,sqlSession先去緩存中查找,是否有該數據,如果有,讀取;
如果沒有,從數據庫中查詢,并將查詢到的數據放入一級緩存區域,供下次查找使用。
但sqlSession執行commit,即增刪改操作時會清空緩存。這么做的目的是避免臟讀。
如果commit不清空緩存,會有以下場景:A查詢了某商品庫存為10件,并將10件庫存的數據存入緩存中,之后被客戶買走了10件,數據被delete了,但是下次查詢這件商品時,并不從數據庫中查詢,而是從緩存中查詢,就會出現錯誤。
二級緩存
二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。
UserMapper有一個二級緩存區域(按namespace分),其它mapper也有自己的二級緩存區域(按namespace分)。每一個namespace的mapper都有一個二級緩存區域,兩個mapper的namespace如果相同,這兩個mapper執行sql查詢到數據將存在相同的二級緩存區域中。
處理流程:
這里有一個問題,既然有了一級緩存,那么為什么要提供二級緩存呢?
二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。二級緩存的作用范圍更大。
還有一個原因,實際開發中,MyBatis通常和Spring進行整合開發。Spring將事務放到Service中管理,對于每一個service中的sqlsession是不同的,這是通過mybatis-spring中的org.mybatis.spring.mapper.MapperScannerConfigurer創建sqlsession自動注入到service中的。 每次查詢之后都要進行關閉sqlSession,關閉之后數據被清空。所以spring整合之后,如果沒有事務,一級緩存是沒有意義的。
二級緩存的使用:
1,打開總開關
在MyBatis的配置文件中加入:
<settings>
<!--開啟二級緩存-->
<setting name="cacheEnabled" value="true"/>
</settings>
2,在需要開啟二級緩存的mapper.xml中加入caceh標簽
<cache/>
3,讓使用二級緩存的POJO類實現Serializable接口
public class User implements Serializable {}
分布式緩存能夠高性能地讀取數據、能夠動態地擴展緩存節點、能夠自動發現和切換故障節點、能夠自動均衡數據分區,而且能夠為使用者提供圖形化的管理界面,部署和維護都十分方便。
而mybatis無法實現分布式緩存,需要和其它分布式緩存框架進行整合。這里簡單介紹和ehcache整合。
整合流程:
mybatis提供了一個cache接口,如果要實現自己的緩存邏輯,實現cache接口開發即可。
mybatis和ehcache整合,mybatis和ehcache整合包中提供了一個cache接口的實現類。
package org.apache.ibatis.cache.impl;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import org.apache.ibatis.cache.Cache;
import org.apache.ibatis.cache.CacheException;
/**
* @author Clinton Begin
*/
public class PerpetualCache implements Cache {
private String id;
private Map<Object, Object> cache = new HashMap<Object, Object>();
public PerpetualCache(String id) {
this.id = id;
}
public String getId() {
return id;
}
public int getSize() {
return cache.size();
}
public void putObject(Object key, Object value) {
cache.put(key, value);
}
public Object getObject(Object key) {
return cache.get(key);
}
public Object removeObject(Object key) {
return cache.remove(key);
}
public void clear() {
cache.clear();
}
public ReadWriteLock getReadWriteLock() {
return null;
}
public boolean equals(Object o) {
if (getId() == null) throw new CacheException("Cache instances require an ID.");
if (this == o)
return true;
if (!(o instanceof Cache))
return false;
Cache otherCache = (Cache) o;
return getId().equals(otherCache.getId());
}
public int hashCode() {
if (getId() == null) throw new CacheException("Cache instances require an ID.");
return getId().hashCode();
}
}
配置步驟:
1,配置mapper中cache中的type為ehcache對cache接口的實現類型
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
表示開啟此mapper的namespace下的二級緩存
type表示指定cache接口的實現類的類型,mybatis默認使用PerpetualCache。
要和ehcache整合,需要配置type為ehcache實現cache接口的類型。
2,加入ehcache的配置文件
在classpath下配置ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="F:\develop\ehcache" /> <defaultCache maxElementsInMemory="1000" maxElementsOnDisk="10000000" eternal="false" overflowToDisk="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> </defaultCache></ehcache>
3,Maven中ehcache 相關依賴
<dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> <version>3.1.3</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-ehcache --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.0.0</version> </dependency>
最后,簡單比較三個比較流行的緩存工具。
ehcache 是一個純Java的進程內緩存框架,hibernate使用其做二級緩存。同時,ehcache可以通過多播的方式實現集群。
memcache是一套分布式的高速緩存系統,提供key-value這樣簡單的數據儲存,可充分利用CPU多核,無持久化功能。
redis高性能的key-value系統,提供豐富的數據類型,單核CPU有抗并發能力,有持久化和主從復制的功能。
“mybatis和ehcache怎么實現緩存”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。