亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis的緩存解析

 更新時(shí)間:2023年09月21日 08:34:33   作者:昱晟168  
這篇文章主要介紹了MyBatis的緩存解析,一級(jí)緩存是SqlSession級(jí)別的,通過(guò)同一個(gè)SqlSession查詢的數(shù)據(jù)會(huì)緩存,下次查詢相同的數(shù)據(jù)就會(huì)從緩存中直接獲取,不會(huì)從數(shù)據(jù)重新訪問(wèn),前提必須是同一個(gè)SqlSession對(duì)象,并且查詢的數(shù)據(jù)相同,需要的朋友可以參考下

MyBatis 的緩存

1. MyBatis 的一級(jí)緩存

一級(jí)緩存是 SqlSession 級(jí)別的,通過(guò)同一個(gè) SqlSession 查詢的數(shù)據(jù)會(huì)緩存,下次查詢相同的數(shù)據(jù)就會(huì)從緩存中直接獲取,不會(huì)從數(shù)據(jù)重新訪問(wèn),前提必須是同一個(gè) SqlSession 對(duì)象,并且查詢的數(shù)據(jù)相同

注意是: SqlSession 是只針對(duì) 查詢的 ,并且一級(jí) SqlSession 是默認(rèn)開(kāi)啟的

使用一級(jí)緩存失效的四種情況

  1. 查詢使用的 SqlSession 對(duì)象不同,就是不同 SqlSession 對(duì)應(yīng)不同的一級(jí)緩存
  2. 同一個(gè) SqlSession 但是查詢條件不同,就是獲取到數(shù)據(jù)不同
  3. 同一個(gè) SqlSession 兩次查詢期間執(zhí)行了任何一次增刪改操作**【就是在兩次查詢期間執(zhí)行了任何一次增刪改操作, MyBatis 就是將一級(jí)緩存,清空掉】**
  4. 同一個(gè) SqlSession 再次查詢期間手動(dòng)清空緩存 【注意是只會(huì)清空一級(jí)緩存】

調(diào)用`SqlSession`對(duì)象中的`clearCache()`方法,手動(dòng)清空緩存 

案例:

Mapper 接口

// 根據(jù)ID查詢員工信息,驗(yàn)證一級(jí)緩存
    Emp getEmpByID(@Param("eid") Integer eid);
    // 插入數(shù)據(jù),驗(yàn)證任何的增刪改都會(huì)使用`MyBatis`清空一級(jí)緩存
    int insertEmp(Emp emp);

Mapper.xml 文件

<!--查詢員工信息-->
    <select id="getEmpByID" resultType="Emp">
        select  * from emp where eid=#{eid};
    </select>
    <!--
        插入數(shù)據(jù),驗(yàn)證任何的增刪改都會(huì)使用`MyBatis`清空一級(jí)緩存
        insertEmp(Emp emp);
    -->
    <insert id="insertEmp" >
        insert into emp values (null,#{empName},#{age},#{sex},#{email},null);
    </insert>

test 類

 @Test
    public void testGetEmpById(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        CacheMapper mapper = sqlSession.getMapper(CacheMapper.class);
        Emp emp1 = mapper.getEmpByID(1);
        Emp emp2 = mapper.getEmpByID(1);
        // 兩次查詢只輸出一條sql:select * from emp where eid=?; 說(shuō)明從一級(jí)緩存獲取數(shù)據(jù)
        System.out.println(emp1);
        System.out.println(emp2);
    }
    @Test
    public void testInsetEmp(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        CacheMapper mapper = sqlSession.getMapper(CacheMapper.class);
        Emp emp1 = mapper.getEmpByID(1);
        // 說(shuō)明任何的增刪改都會(huì)使用`MyBatis`清空一級(jí)緩存
        int i = mapper.insertEmp(new Emp(null, "a", 20, "男", "123qq.com"));
       // 手動(dòng)清空`mybatis`一級(jí)緩存 ,也可以使用兩次查詢相同數(shù)據(jù)時(shí),訪問(wèn)兩次數(shù)據(jù)庫(kù)
//        sqlSession.clearCache();
        Emp emp2 = mapper.getEmpByID(1);
        System.out.println(emp1);
        System.out.println(emp2);
        System.out.println(i);
    }

2.二級(jí)緩存

注意是:當(dāng)我們沒(méi)有關(guān)閉 SqlSession 或沒(méi)有提交事務(wù)時(shí),數(shù)據(jù)是保存在 一級(jí)緩存 中,當(dāng)我們關(guān)閉 SqlSession 或提交事務(wù)后,數(shù)據(jù)是保存在 二級(jí)緩存 中

sqlSession.commit();
sqlSession.close();
數(shù)據(jù)會(huì)保存到二級(jí)緩存 ,必須我們手動(dòng)提交事務(wù)或關(guān)閉流才能使數(shù)據(jù)保存到二級(jí)緩存中,否則只會(huì)保存在一級(jí)緩存中
     sqlSession1.commit();
        //sqlSession1.commit();或sqlSession1.close();都會(huì)使用數(shù)據(jù)保存到二級(jí)緩存中,否則只會(huì)保存在一級(jí)緩存中

概念:

二級(jí)緩存是 SqlSessionFactory 級(jí)別,通過(guò)同一個(gè) SqlSessionFactory 創(chuàng)建的 SqlSession 查詢到的結(jié)果會(huì)被緩存,此后若再次執(zhí)行相同的查詢語(yǔ)句,結(jié)果就會(huì)從緩存中獲取

1.二級(jí)緩存開(kāi)啟條件:

  • 在核心配置文件中,設(shè)置全局配置屬性 cachEnabled=true ,默認(rèn)為 true ,不需要設(shè)置
  • 在映射文件中設(shè)置 <cache/> 【就是在 Mapper.xml 文件中設(shè)置】
 <!--開(kāi)啟二級(jí)緩存-->
    <cache />
  • 二級(jí)緩存必須在 SqlSession 關(guān)閉或提交之后有效
sqlSession.commit();
sqlSession.close();
數(shù)據(jù)會(huì)保存到二級(jí)緩存 ,必須我們手動(dòng)提交事務(wù)或關(guān)閉流才能使數(shù)據(jù)保存到二級(jí)緩存中,否則只會(huì)保存在一級(jí)緩存中
     sqlSession1.commit();
        //sqlSession1.commit();或sqlSession1.close();都會(huì)使用數(shù)據(jù)保存到二級(jí)緩存中,否則只會(huì)保存在一級(jí)緩存中
  • 查詢的數(shù)據(jù)所轉(zhuǎn)換的實(shí)體類類型必須實(shí)現(xiàn) 序列化接口 【就是查詢的數(shù)據(jù)封裝成 JavaBean 類該類必須實(shí)現(xiàn) 序列化接口 】
public class Emp implements Serializable {代碼}

2.二級(jí)緩存失效的情況:【只有一種情況就是 增刪改 】

兩次查詢之間執(zhí)行了任意的 增刪改 ,都會(huì)使 一級(jí) 和 二級(jí) 緩存 同時(shí)失效

注意是:手動(dòng)調(diào)用SqlSession 對(duì)象中的 clearCache()`方法,手動(dòng)清空的緩存 ,只會(huì)清空一級(jí)緩存,對(duì)二級(jí)緩存不起作用,只有增刪改對(duì)二級(jí)緩存失效

3.二級(jí)緩存相關(guān)配置

在 mapper 配置文件中添加的 cache 標(biāo)簽可以設(shè)置一些屬性:

<cache eviction="" blocking="" flushInterval="" readOnly="" size="" type="" />
type:該屬性是來(lái)設(shè)置使用第三方整合二級(jí)緩存,如果不指定默認(rèn)使用的是`MyBatis`中的二級(jí)緩存
  • eviction屬性:緩存回收策略 【mybatis采用是這種方式】
  • LRU(Least Recently Used) – 最近最少使用的:移除最長(zhǎng)時(shí)間不被使用的對(duì)象。
  • FIFO(First in First out) – 先進(jìn)先出:按對(duì)象進(jìn)入緩存的順序來(lái)移除它們。
  • SOFT – 軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對(duì)象。
  • WEAK – 弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對(duì)象。 默認(rèn)的是 LRU。
  • flushInterval屬性:刷新間隔,單位毫秒
  • 默認(rèn)情況是不設(shè)置,也就是沒(méi)有刷新間隔,緩存僅僅調(diào)用語(yǔ)句時(shí)刷新
  • size屬性:引用數(shù)目,正整數(shù)
  • 代表緩存最多可以存儲(chǔ)多少個(gè)對(duì)象,太大容易導(dǎo)致內(nèi)存溢出
  • readOnly屬性:只讀,true/false
  • true:只讀緩存;會(huì)給所有調(diào)用者返回緩存對(duì)象的相同實(shí)例。因此這些對(duì)象不能被修改。這提供了 很重要的性能優(yōu)勢(shì)。
  • false:讀寫(xiě)緩存;會(huì)返回緩存對(duì)象的拷貝(通過(guò)序列化)。這會(huì)慢一些,但是安全,因此默認(rèn)是 false。

3.MyBatis緩存查詢的順序

  • 先查詢二級(jí)緩存,因?yàn)槎?jí)緩存中可能會(huì)有其他程序已經(jīng)查出來(lái)的數(shù)據(jù),可以拿來(lái)直接使用
  • 如果二級(jí)緩存沒(méi)有命中,再查詢一級(jí)緩存
  • 如果一級(jí)緩存也沒(méi)有命中,則查詢數(shù)據(jù)庫(kù)
  • SqlSession關(guān)閉或提交后,一級(jí)緩存中的數(shù)據(jù)會(huì)寫(xiě)入二級(jí)緩存中

4.整合第三方緩存EHCache

注意是:整合第三方緩存,只能對(duì) MyBatis 二級(jí)緩存作用,對(duì)一級(jí)緩存不起作用,整合第三緩存,只是替換 mybatis 中的二級(jí)緩存的

使用步驟:

1.添加依賴

<!-- Mybatis EHCache整合包 -->
        <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-ehcache</artifactId>
            <version>1.2.1</version>
        </dependency>
        <!-- slf4j日志門面的一個(gè)具體實(shí)現(xiàn) -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

2.各個(gè) jar 包功能

jar 包名稱作用
mybatis-ehcacheMybatis和EHCache整合包
ehcacheEHCache核心包
slf4j-apiSLF4J日志面包【就是接口】
logback-classic支持SLF4J門面接口一個(gè)具體實(shí)現(xiàn)【就是接口的實(shí)現(xiàn)類】

3. 創(chuàng)建EHCache的配置文件ehcache.xml 【注意是:名稱必須是 ehcache.xml 】

<?xml version="1.0" encoding="utf-8" ?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
    <!-- 磁盤(pán)保存路徑 -->
    <diskStore path="D:\haikang\ehcache"/>
    <defaultCache
            maxElementsInMemory="1000"
            maxElementsOnDisk="10000000"
            eternal="false"
            overflowToDisk="true"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
    </defaultCache>
</ehcache>

4.設(shè)置二級(jí)緩存的類型【在 Mapper.xml 文件中設(shè)置】

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

5.加入 logback 日志【日志名稱不能修改】

存在 SLF4J 時(shí),作為簡(jiǎn)易日志的 log4j 將失效,此時(shí)我們需要借助 SLF4J 的具體實(shí)現(xiàn) logback 來(lái)打印日志。 創(chuàng)建 logback 的配置文件 logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!-- 指定日志輸出的位置 -->
    <appender name="STDOUT"
              class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
    <!-- 日志輸出的格式 -->
    <!-- 按照順序分別是:時(shí)間、日志級(jí)別、線程名稱、打印日志的類、日志主體內(nèi)容、換行 -->
    <pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger]
    [%msg]%n</pattern>
    </encoder>
    </appender>
    <!-- 設(shè)置全局日志級(jí)別。日志級(jí)別按順序分別是:DEBUG、INFO、WARN、ERROR -->
    <!-- 指定任何一個(gè)日志級(jí)別都只打印當(dāng)前級(jí)別和后面級(jí)別的日志。 -->
    <root level="DEBUG">
        <!-- 指定打印日志的appender,這里通過(guò)“STDOUT”引用了前面配置的appender -->
        <appender-ref ref="STDOUT" />
    </root>
    <!-- 根據(jù)特殊需求指定局部日志級(jí)別 -->
    <logger name="com.atguigu.crowd.mapper" level="DEBUG"/>
</configuration>

6. EHCache 配置文件說(shuō)明

屬性名是否必須作用
maxElementsInMemory在內(nèi)存中緩存的element的最大數(shù)目
maxElementsOnDisk在磁盤(pán)上緩存的element的最大數(shù)目,若是0表示無(wú) 窮大
eternal設(shè)定緩存的elements是否永遠(yuǎn)不過(guò)期。 如果為 true,則緩存的數(shù)據(jù)始終有效, 如果為false那么還 要根據(jù)timeToIdleSeconds、timeToLiveSeconds 判斷
overflowToDisk設(shè)定當(dāng)內(nèi)存緩存溢出的時(shí)候是否將過(guò)期的element 緩存到磁盤(pán)上
timeToIdleSeconds當(dāng)緩存在EhCache中的數(shù)據(jù)前后兩次訪問(wèn)的時(shí)間超 過(guò)timeToIdleSeconds的屬性取值時(shí), 這些數(shù)據(jù)便 會(huì)刪除,默認(rèn)值是0,也就是可閑置時(shí)間無(wú)窮大
timeToLiveSeconds緩存element的有效生命期,默認(rèn)是0.,也就是 element存活時(shí)間無(wú)窮大
diskSpoolBufferSizeMBDiskStore(磁盤(pán)緩存)的緩存區(qū)大小。默認(rèn)是 30MB。每個(gè)Cache都應(yīng)該有自己的一個(gè)緩沖區(qū)
diskPersistent在VM重啟的時(shí)候是否啟用磁盤(pán)保存EhCache中的數(shù) 據(jù),默認(rèn)是false。
diskExpiryThreadIntervalSeconds磁盤(pán)緩存的清理線程運(yùn)行間隔,默認(rèn)是120秒。每 個(gè)120s, 相應(yīng)的線程會(huì)進(jìn)行一次EhCache中數(shù)據(jù)的 清理工作
memoryStoreEvictionPolicy當(dāng)內(nèi)存緩存達(dá)到最大,有新的element加入的時(shí) 候, 移除緩存中element的策略。 默認(rèn)是LRU(最 近最少使用),可選的有LFU(最不常使用)和 FIFO(先進(jìn)先出)

注意文件的存放位置

在這里插入圖片描述

到此這篇關(guān)于MyBatis的緩存解析的文章就介紹到這了,更多相關(guān)MyBatis的緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Eclipse中maven的配置詳解

    Eclipse中maven的配置詳解

    這篇文章主要介紹了Eclipse中maven的配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 詳解SpringBoot異常處理流程及原理

    詳解SpringBoot異常處理流程及原理

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著SpringBoot異常處理流程及原理展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 23種設(shè)計(jì)模式(18)java備忘錄模式

    23種設(shè)計(jì)模式(18)java備忘錄模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java備忘錄模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java輸入年份和月份判斷多少天實(shí)例代碼

    Java輸入年份和月份判斷多少天實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Java輸入年度和月份判斷多少天的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 基于Java回顧之JDBC的使用詳解

    基于Java回顧之JDBC的使用詳解

    本篇文章是對(duì)Java中JDBC的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Eclipse中配置Maven build打包的方法步驟

    Eclipse中配置Maven build打包的方法步驟

    這篇文章主要介紹了Eclipse中配置Maven build打包的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java實(shí)現(xiàn)為圖片添加水印功能

    Java實(shí)現(xiàn)為圖片添加水印功能

    在圖像處理領(lǐng)域,水印是一種常見(jiàn)的保護(hù)版權(quán)和標(biāo)識(shí)圖片歸屬的方法,Java提供了強(qiáng)大的圖像處理能力,可以通過(guò)Graphics2D類在圖像上繪制水印,下面我們來(lái)看看具體操作步驟吧
    2025-02-02
  • Mybatis配置解析看這一篇就夠了

    Mybatis配置解析看這一篇就夠了

    這篇文章主要介紹了詳解Mybatis是如何解析配置文件的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • 使用Idea簡(jiǎn)單快速搭建springcloud項(xiàng)目的圖文教程

    使用Idea簡(jiǎn)單快速搭建springcloud項(xiàng)目的圖文教程

    這篇文章主要介紹了使用Idea簡(jiǎn)單快速搭建springcloud項(xiàng)目,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 快速排序算法原理及java遞歸實(shí)現(xiàn)

    快速排序算法原理及java遞歸實(shí)現(xiàn)

    快速排序 對(duì)冒泡排序的一種改進(jìn),若初始記錄序列按關(guān)鍵字有序或基本有序,蛻化為冒泡排序。使用的是遞歸原理,在所有同數(shù)量級(jí)O(n longn) 的排序方法中,其平均性能最好。就平均時(shí)間而言,是目前被認(rèn)為最好的一種內(nèi)部排序方法
    2014-01-01

最新評(píng)論