中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mybatis和ehcache怎么實現緩存

發布時間:2022-01-05 14:48:06 來源:億速云 閱讀:166 作者:iii 欄目:大數據

本篇內容介紹了“mybatis和ehcache怎么實現緩存”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

緩存的概念

        java里緩存可以分兩種情況,一種是JVM的緩存,這個是JVM與操作系統打交道用的,在使用java語言開發時,一般不用到。

        一種是java語言緩存,這里的緩存是一種機制,不與任何硬件相關。比如一個 static的變量, 當第一次訪問他時我們到文件里讀他的值,以后訪問時,直接把這個值返回去,這里省下了IO的時間,提高了效率,這就是一個簡單的緩存機制。

一級緩存

        一級緩存是SqlSession級別的緩存。在操作數據庫時需要構造sqlSession對象,在對象中有一個數據結構用于存儲緩存數據。不同的sqlSession之間的緩存數據區域是互相不影響的。也就是他只能作用在同一個sqlSession中,不同的sqlSession中的緩存是互相不能讀取的。

處理流程:

mybatis和ehcache怎么實現緩存

        用戶發起查詢請求,查找某條數據,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查詢到數據將存在相同的二級緩存區域中。

處理流程:

mybatis和ehcache怎么實現緩存

這里有一個問題,既然有了一級緩存,那么為什么要提供二級緩存呢?

        二級緩存是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 {}

整合ehcache

        分布式緩存能夠高性能地讀取數據、能夠動態地擴展緩存節點、能夠自動發現和切換故障節點、能夠自動均衡數據分區,而且能夠為使用者提供圖形化的管理界面,部署和維護都十分方便。

        而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怎么實現緩存”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

青海省| 城步| 大理市| 竹北市| 盱眙县| 从化市| 松原市| 雷波县| 喀什市| 荃湾区| 西和县| 陇川县| 上栗县| 翁牛特旗| 泰来县| 津南区| 海晏县| 盐池县| 凉山| 澄江县| 云阳县| 淮北市| 大宁县| 青川县| 泽州县| 广东省| 房产| 汝州市| 洛隆县| 北安市| 石渠县| 土默特左旗| 宿松县| 山东省| 奉节县| 香格里拉县| 霍林郭勒市| 奉化市| 桦甸市| 抚顺县| 柳河县|