欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis一級(jí)緩存與二級(jí)緩存原理與作用分析

 更新時(shí)間:2022年12月27日 11:21:53   作者:一個(gè)雙子座的Java攻城獅  
mybatis-plus是一個(gè)Mybatis的增強(qiáng)工具,在Mybatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,這篇文章帶你了解Mybatis的一級(jí)和二級(jí)緩存

緩存的作用

在 Web 系統(tǒng)中,最重要的操作就是查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù)。但是有些時(shí)候查詢數(shù)據(jù)的頻率非常高,這是很耗費(fèi)數(shù)據(jù)庫(kù)資源的,往往會(huì)導(dǎo)致數(shù)據(jù)庫(kù)查詢效率極低,影響客戶的操作體驗(yàn)。于是可以將一些變動(dòng)不大且訪問(wèn)頻率高的數(shù)據(jù),放置在一個(gè)緩存容器中,用戶下一次查詢時(shí)就從緩存容器中獲取結(jié)果。

MyBatis 的緩存結(jié)構(gòu)

MyBatis 系統(tǒng)中默認(rèn)定義了兩級(jí)緩存:一級(jí)緩存和二級(jí)緩存:

MyBatis 一級(jí)緩存是一個(gè) SqlSession 級(jí)別,Sqlsession 只能訪問(wèn)自己的一級(jí)緩存的數(shù)據(jù)。

二級(jí)緩存是跨 sqlSession,是 mapper 級(jí)別的緩存,對(duì)于 mapper 級(jí)別的緩存不同的 sqlsession 是可以共享的。

MyBatis 默認(rèn)開(kāi)啟一級(jí)緩存,同時(shí)為了增強(qiáng)擴(kuò)展性,MyBatis 定義了緩存接口 Cache,可以通過(guò) Cache 自定義二級(jí)緩存。

一級(jí)緩存

MyBatis 一級(jí)緩存是一個(gè) SqlSession 級(jí)別的緩存,緩存的執(zhí)行遵循下方的規(guī)則:

  • 映射語(yǔ)句文件中的所有 select 語(yǔ)句的結(jié)果將會(huì)被緩存。
  • 映射語(yǔ)句文件中的所有 insert、update 和 delete 語(yǔ)句會(huì)刷新緩存。
  • 緩存默認(rèn)會(huì)使用最近最少使用算法(LRU, Least Recently Used)算法來(lái)清除不需要的緩存。
  • 緩存不會(huì)定時(shí)進(jìn)行刷新(也就是說(shuō),沒(méi)有刷新間隔)。
  • 緩存會(huì)保存列表或?qū)ο螅o(wú)論查詢方法返回哪種)的 1024 個(gè)引用。
  • 緩存會(huì)被視為讀/寫(xiě)緩存,這意味著獲取到的對(duì)象并不是共享的,可以安全地被調(diào)用者修改,而不干擾其他調(diào)用者或線程所做的潛在修改。

接下來(lái)通過(guò)代碼模擬一級(jí)緩存的執(zhí)行,用的代碼是最簡(jiǎn)單的一個(gè)用戶類,首先第一步在 mybatis-config 中開(kāi)啟 log 日志:

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

編寫(xiě)測(cè)試代碼,在同樣的查詢條件下查詢第二次:

public class CacheTest1 {
    public static void main(String[] args) {
        // 獲取SqlSession
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        // 執(zhí)行Sql
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user=mapper.getUserById(1);
        System.out.println(user);
        //同樣的條件查詢第二次
        User user2=mapper.getUserById(1);
        System.out.println(user2);
        sqlSession.close();
    }
}

首先這段代碼是在一個(gè) SqlSession 下,因此默認(rèn)開(kāi)啟了一級(jí)緩存,在結(jié)果中可以看到,第一次查詢走的是數(shù)據(jù)庫(kù),第二次就不需要再查數(shù)據(jù)庫(kù)了。滿足第一條規(guī)則:

映射語(yǔ)句文件中的所有 select 語(yǔ)句的結(jié)果將會(huì)被緩存。

修改條件,在查詢第二次之前先往表里插入一條數(shù)據(jù):

public class CacheTest2 {
    public static void main(String[] args) {
        // 獲取SqlSession
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        // 執(zhí)行Sql
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user=mapper.getUserById(1);
        System.out.println(user);
        //第二次查詢前先插入一條數(shù)據(jù)
        User user1=new User(5,"java");
        mapper.insertUser(user1);
        //同樣的條件查詢第二次
        User user2=mapper.getUserById(2);
        System.out.println(user2);
        sqlSession.close();
    }
}

在第一次查詢之后插入了一條數(shù)據(jù),第二次同樣條件查詢時(shí)沒(méi)有走緩存,再次查表,符合規(guī)則:

映射語(yǔ)句文件中的所有 insert、update 和 delete 語(yǔ)句會(huì)刷新緩存。

二級(jí)緩存

二級(jí)緩存的作用域比一級(jí)緩存要更大,二級(jí)緩存是 mapper 級(jí)別的緩存,你也可以理解為他是一個(gè) namespace 內(nèi)的緩存。

開(kāi)啟二級(jí)緩存需要幾個(gè)步驟:

1、 MyBatis 中開(kāi)啟緩存需要首先在設(shè)置中開(kāi)啟 cacheEnabled

<settings>
    <setting name="cacheEnabled" value="true"/>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

cacheEnabled 默認(rèn)也是開(kāi)啟狀態(tài)。

2、 在 mapper.xml 中使用二級(jí)緩存

在 UserMapper.xml 文件的 mapper 節(jié)點(diǎn)下增加一行 , 這個(gè) mapper 就開(kāi)啟了二級(jí)緩存。

MyBatis 緩存要求對(duì)應(yīng)的對(duì)象需要實(shí)現(xiàn)序列話,因此給 User 對(duì)象加上序列化

import java.io.Serializable;
public class User implements Serializable{
    private static final long serialVersionUID = 1L;
    private int id;
    private String name;
    public User(){}
    public User(int id,String name){
        this.id=id;
        this.name=name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    @Override
    public String toString() {
        return "id:"+this.id+" name:"+this.name;
    }
}

編寫(xiě)測(cè)試用例,下面這段代碼在第一次查詢結(jié)束后關(guān)閉了 SqlSession,接著重新生成一個(gè) SqlSession 執(zhí)行第二次查詢,一級(jí)緩存就沒(méi)有用了,這樣的場(chǎng)景下就需要二級(jí)緩存。

public class CacheTest3 {
    public static void main(String[] args) {
        // 獲取SqlSession
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        // 執(zhí)行Sql
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user=mapper.getUserById(1);
        System.out.println(user);
        // 第一次查詢結(jié)束后關(guān)閉 SqlSession
        sqlSession.close();
        sqlSession = MyBatisUtils.getSqlSession();
        // 執(zhí)行Sql
        mapper = sqlSession.getMapper(UserMapper.class);
        //同樣的條件查詢第二次
        User user2=mapper.getUserById(1);
        System.out.println(user2);
        sqlSession.close();
    }
}

使用 useCache 對(duì)具體某一個(gè)查詢?cè)O(shè)置不適用緩存:

<select id="getUserById" resultMap="UserMap" parameterType="int" useCache="false">
    select id,name from user where id=#{id};
</select>

cache 標(biāo)簽可以通過(guò)配置進(jìn)行修改:

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="false"/>

重點(diǎn)講一下清除策略(eviction):

  • LRU – 最近最少使用:移除最長(zhǎng)時(shí)間不被使用的對(duì)象。
  • FIFO – 先進(jìn)先出:按對(duì)象進(jìn)入緩存的順序來(lái)移除它們。
  • SOFT – 軟引用:基于垃圾回收器狀態(tài)和軟引用規(guī)則移除對(duì)象。
  • WEAK – 弱引用:更積極地基于垃圾收集器狀態(tài)和弱引用規(guī)則移除對(duì)象。

這里主要了解 LRU 和 FIFO 即可,默認(rèn)的清除策略是 LRU。

其他幾個(gè)屬性的配置如下:

flushInterval(刷新間隔)屬性可以被設(shè)置為任意的正整數(shù),設(shè)置的值應(yīng)該是一個(gè)以毫秒為單位的合理時(shí)間量。 默認(rèn)情況是不設(shè)置,也就是沒(méi)有刷新間隔,緩存僅僅會(huì)在調(diào)用語(yǔ)句時(shí)刷新。

size(引用數(shù)目)屬性可以被設(shè)置為任意正整數(shù),要注意欲緩存對(duì)象的大小和運(yùn)行環(huán)境中可用的內(nèi)存資源。默認(rèn)值是 1024。

readOnly(只讀)屬性可以被設(shè)置為 true 或 false,默認(rèn)為 false。只讀的緩存會(huì)給所有調(diào)用者返回緩存對(duì)象的相同實(shí)例, 因此這些對(duì)象不能被修改,這就提供了可觀的性能提升。而可讀寫(xiě)的緩存會(huì)(通過(guò)序列化)返回緩存對(duì)象的拷貝,速度上會(huì)慢一些,但是更安全。

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

相關(guān)文章

  • 初識(shí)Java一些常見(jiàn)的數(shù)據(jù)類型

    初識(shí)Java一些常見(jiàn)的數(shù)據(jù)類型

    這篇文章主要介紹Java一些常見(jiàn)的數(shù)據(jù)類型,Java是一種優(yōu)秀的程序設(shè)計(jì)語(yǔ)言,它具有令人賞心悅目的語(yǔ)法和易于理解的語(yǔ)義,下面文章小編就來(lái)簡(jiǎn)單介紹為什么說(shuō)Java是最好的語(yǔ)言并且介紹它的各種常見(jiàn)類型,需要的朋友可以參考一下
    2021-10-10
  • SpringBoot整合阿里云短信服務(wù)的方法

    SpringBoot整合阿里云短信服務(wù)的方法

    在實(shí)際項(xiàng)目中經(jīng)常有發(fā)送短信的功能,今天進(jìn)說(shuō)一下SpringBoot整合阿里云短信服務(wù)的相關(guān)知識(shí),新建短信微服務(wù),編寫(xiě)發(fā)送短信接口的方法文中給大家介紹的很詳細(xì),需要的朋友參考下吧
    2021-10-10
  • SpringBoot訪問(wèn)web中的靜態(tài)資源的方式小結(jié)

    SpringBoot訪問(wèn)web中的靜態(tài)資源的方式小結(jié)

    這篇文章主要介紹了SpringBoot訪問(wèn)web中的靜態(tài)資源的方式,本文給大家介紹了兩種方式,通過(guò)代碼示例和圖文講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-10-10
  • 微信APP支付(IOS手機(jī)端+java后臺(tái))版

    微信APP支付(IOS手機(jī)端+java后臺(tái))版

    這篇文章主要為大家詳細(xì)介紹了微信APP支付(IOS手機(jī)端+java后臺(tái))版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Java中類的加載順序剖析(常用于面試題)

    Java中類的加載順序剖析(常用于面試題)

    這篇文章主要介紹了Java中類的加載順序剖析(常用于面試題),本文直接給出代碼實(shí)例和運(yùn)行結(jié)果,給后給出了加載過(guò)程總結(jié),需要的朋友可以參考下
    2015-03-03
  • 詳解Java如何通過(guò)裝飾器模式擴(kuò)展系統(tǒng)功能

    詳解Java如何通過(guò)裝飾器模式擴(kuò)展系統(tǒng)功能

    這篇文章主要為大家詳細(xì)介紹了Java如何通過(guò)裝飾器模式擴(kuò)展系統(tǒng)功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-04-04
  • 深入解析Java編程中的抽象類

    深入解析Java編程中的抽象類

    這篇文章主要介紹了Java編程中的抽象類,抽象類體現(xiàn)了Java面向?qū)ο缶幊痰奶匦?需要的朋友可以參考下
    2015-10-10
  • SpringBoot配置Spring?Security的實(shí)現(xiàn)示例

    SpringBoot配置Spring?Security的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot配置Spring?Security的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • Java中的@interface注解使用詳解

    Java中的@interface注解使用詳解

    這篇文章主要介紹了Java中的@interface注解使用詳解,注解@interface不是接口是注解類,在jdk1.5之后加入的功能,使用@interface自定義注解時(shí),自動(dòng)繼承了java.lang.annotation.Annotation接口,需要的朋友可以參考下
    2023-12-12
  • java多線程Thread的實(shí)現(xiàn)方法代碼詳解

    java多線程Thread的實(shí)現(xiàn)方法代碼詳解

    這篇文章主要介紹了java多線程Thread的實(shí)現(xiàn)方法代碼詳解,涉及start(),run(),stop(),interrupt(),isInterrupted(),join()和join(long millis)等方法的介紹,具有一定借鑒價(jià)值,需要的朋友可以了解下。
    2017-11-11

最新評(píng)論