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

溫馨提示×

溫馨提示×

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

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

MyBatis一級緩存與二級緩存原理與作用是什么

發布時間:2022-12-28 09:25:02 來源:億速云 閱讀:131 作者:iii 欄目:開發技術

這篇“MyBatis一級緩存與二級緩存原理與作用是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“MyBatis一級緩存與二級緩存原理與作用是什么”文章吧。

緩存的作用

在 Web 系統中,最重要的操作就是查詢數據庫中的數據。但是有些時候查詢數據的頻率非常高,這是很耗費數據庫資源的,往往會導致數據庫查詢效率極低,影響客戶的操作體驗。于是可以將一些變動不大且訪問頻率高的數據,放置在一個緩存容器中,用戶下一次查詢時就從緩存容器中獲取結果。

MyBatis 的緩存結構

MyBatis 系統中默認定義了兩級緩存:一級緩存和二級緩存:

MyBatis 一級緩存是一個 SqlSession 級別,Sqlsession 只能訪問自己的一級緩存的數據。

二級緩存是跨 sqlSession,是 mapper 級別的緩存,對于 mapper 級別的緩存不同的 sqlsession 是可以共享的。

MyBatis 默認開啟一級緩存,同時為了增強擴展性,MyBatis 定義了緩存接口 Cache,可以通過 Cache 自定義二級緩存。

一級緩存

MyBatis 一級緩存是一個 SqlSession 級別的緩存,緩存的執行遵循下方的規則:

  • 映射語句文件中的所有 select 語句的結果將會被緩存。

  • 映射語句文件中的所有 insert、update 和 delete 語句會刷新緩存。

  • 緩存默認會使用最近最少使用算法(LRU, Least Recently Used)算法來清除不需要的緩存。

  • 緩存不會定時進行刷新(也就是說,沒有刷新間隔)。

  • 緩存會保存列表或對象(無論查詢方法返回哪種)的 1024 個引用。

  • 緩存會被視為讀/寫緩存,這意味著獲取到的對象并不是共享的,可以安全地被調用者修改,而不干擾其他調用者或線程所做的潛在修改。

接下來通過代碼模擬一級緩存的執行,用的代碼是最簡單的一個用戶類,首先第一步在 mybatis-config 中開啟 log 日志:

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

編寫測試代碼,在同樣的查詢條件下查詢第二次:

public class CacheTest1 {
    public static void main(String[] args) {
        // 獲取SqlSession
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        // 執行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();
    }
}

MyBatis一級緩存與二級緩存原理與作用是什么

首先這段代碼是在一個 SqlSession 下,因此默認開啟了一級緩存,在結果中可以看到,第一次查詢走的是數據庫,第二次就不需要再查數據庫了。滿足第一條規則:

映射語句文件中的所有 select 語句的結果將會被緩存。

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

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

MyBatis一級緩存與二級緩存原理與作用是什么

在第一次查詢之后插入了一條數據,第二次同樣條件查詢時沒有走緩存,再次查表,符合規則:

映射語句文件中的所有 insert、update 和 delete 語句會刷新緩存。

二級緩存

二級緩存的作用域比一級緩存要更大,二級緩存是 mapper 級別的緩存,你也可以理解為他是一個 namespace 內的緩存。

開啟二級緩存需要幾個步驟:

1、 MyBatis 中開啟緩存需要首先在設置中開啟 cacheEnabled

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

cacheEnabled 默認也是開啟狀態。

2、 在 mapper.xml 中使用二級緩存

在 UserMapper.xml 文件的 mapper 節點下增加一行 , 這個 mapper 就開啟了二級緩存。

MyBatis 緩存要求對應的對象需要實現序列話,因此給 User 對象加上序列化

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;
    }
}

編寫測試用例,下面這段代碼在第一次查詢結束后關閉了 SqlSession,接著重新生成一個 SqlSession 執行第二次查詢,一級緩存就沒有用了,這樣的場景下就需要二級緩存。

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

MyBatis一級緩存與二級緩存原理與作用是什么

使用 useCache 對具體某一個查詢設置不適用緩存:

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

cache 標簽可以通過配置進行修改:

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

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

  • LRU &ndash; 最近最少使用:移除最長時間不被使用的對象。

  • FIFO &ndash; 先進先出:按對象進入緩存的順序來移除它們。

  • SOFT &ndash; 軟引用:基于垃圾回收器狀態和軟引用規則移除對象。

  • WEAK &ndash; 弱引用:更積極地基于垃圾收集器狀態和弱引用規則移除對象。

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

其他幾個屬性的配置如下:

flushInterval(刷新間隔)屬性可以被設置為任意的正整數,設置的值應該是一個以毫秒為單位的合理時間量。 默認情況是不設置,也就是沒有刷新間隔,緩存僅僅會在調用語句時刷新。

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

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

以上就是關于“MyBatis一級緩存與二級緩存原理與作用是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

郁南县| 长沙市| 关岭| 沙雅县| 渭南市| 邮箱| 玉溪市| 石门县| 南通市| 林甸县| 东莞市| 闵行区| 平阴县| 长顺县| 新建县| 彰武县| 天等县| 兴义市| 财经| 临江市| 卢湾区| 拉萨市| 永善县| 金秀| 陇南市| 夏河县| 兴文县| 合作市| 淮南市| 隆林| 蓬安县| 秭归县| 明水县| 江华| 渑池县| 钟祥市| 泾川县| 芜湖县| 江安县| 民乐县| 云阳县|