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

MyBatis一級(jí)緩存避坑完全指南

 更新時(shí)間:2018年11月28日 11:53:04   作者:justmehyp  
這篇文章主要給大家介紹了關(guān)于MyBatis一級(jí)緩存避坑的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一級(jí)緩存概念
當(dāng)我們使用Mybatis進(jìn)行數(shù)據(jù)庫(kù)的操作時(shí)候,會(huì)創(chuàng)建一個(gè)SqlSession來(lái)進(jìn)行一次數(shù)據(jù)庫(kù)的會(huì)話,會(huì)話結(jié)束則關(guān)閉SqlSession對(duì)象。那么一個(gè)SqlSession的生命周期即對(duì)應(yīng)于Mybatis的一次會(huì)話。在Mybatis的一次會(huì)話中,我們很有可能多次查詢完全相同的sql語(yǔ)句,如果不采取措施的話,每一次查詢都查詢一次數(shù)據(jù)庫(kù)。而一次會(huì)話時(shí)間一般都是極短的,相同Sql的查詢結(jié)果極有可能完全相同。由于查詢數(shù)據(jù)庫(kù)代價(jià)是比較大的,這會(huì)導(dǎo)致系統(tǒng)的資源浪費(fèi)。

為了解決這個(gè)問(wèn)題,Mybatis對(duì)每一次會(huì)話都添加了緩存操作。這個(gè)緩存的作用域?yàn)橐淮螘?huì)話中。緩存隨著會(huì)話(SqlSession)的創(chuàng)建而產(chǎn)生,隨著會(huì)話結(jié)束而釋放。對(duì)一次會(huì)話的查詢操作,總是先查看緩存中是否存在查詢結(jié)果,如果存在則直接取緩存中的結(jié)果,不存在則查詢數(shù)據(jù)庫(kù)。這樣的話,一次會(huì)話中的完全相同的查詢則只會(huì)查詢一次,節(jié)省了系統(tǒng)資源。

引言

MyBatis 一級(jí)緩存(MyBaits 稱其為 Local Cache)無(wú)法關(guān)閉,但是有兩種級(jí)別可選:

package org.apache.ibatis.session;

/**
 * @author Eduardo Macarron
 */
public enum LocalCacheScope {
 SESSION, //session 級(jí)別的緩存 STATEMENT //statement 級(jí)別的緩存
}

1)session 級(jí)別的緩存

在同一個(gè) sqlSession 內(nèi),對(duì)同樣的查詢將不再查詢數(shù)據(jù)庫(kù),直接從緩存中。

驗(yàn)證代碼:

[

public static void main(String[] args) throws IOException { InputStream inputStream = new ClassPathResource("mybatis.xml").getInputStream(); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); System.out.println(mapper.get(1L)); System.out.println("-------------------"); System.out.println(mapper.get(1L));}

輸出:

日志輸出可以看到,第一次查詢通過(guò)數(shù)據(jù)庫(kù)查詢,第二次則沒(méi)有,直接通過(guò)緩存讀取。

坑:這種緩存策略有一個(gè)坑,在服務(wù)集群時(shí)就會(huì)出現(xiàn)問(wèn)題。

假設(shè)現(xiàn)在有一個(gè)服務(wù)集群,有兩個(gè)節(jié)點(diǎn)。

首先,兩個(gè)節(jié)點(diǎn)都進(jìn)行了同樣的查詢,兩個(gè)節(jié)點(diǎn)都有自己的一級(jí)緩存,后續(xù)同樣的查詢,兩個(gè)節(jié)點(diǎn)將不再查詢數(shù)據(jù)庫(kù)。

如果此時(shí)節(jié)點(diǎn) 1 執(zhí)行了 update 語(yǔ)句,那么節(jié)點(diǎn) 1 的一級(jí)緩存會(huì)被刷新,而節(jié)點(diǎn) 2 的一級(jí)緩存不會(huì)改變。

2)statement 級(jí)別的緩存

避坑: 為了避免這個(gè)問(wèn)題,可以將一級(jí)緩存的級(jí)別設(shè)為 statement 級(jí)別的,這樣每次查詢結(jié)束都會(huì)清掉一級(jí)緩存。MyBatis 源碼如下:

在 MyBatis 的配置文件中,添加以下配置:

驗(yàn)證代碼和上面的一樣不變。

輸出:

可以看到,即使是同樣的查詢,每次查詢都是直接讀取數(shù)據(jù)庫(kù)了。

避坑完畢。

緩存是不可能不要緩存的,這個(gè)時(shí)候,就需要使用緩存中間件了,由緩存中間件管理緩存。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • java線程池使用及原理面試題

    java線程池使用及原理面試題

    很多面試官喜歡把線程池作為問(wèn)題的起點(diǎn),然后延伸到其它內(nèi)容,由于我們專欄已經(jīng)說(shuō)過(guò)隊(duì)列、線程、鎖面試題了,所以本章面試題還是以線程池為主
    2022-03-03
  • 使用SpringBoot與EasyExcel實(shí)現(xiàn)復(fù)雜的導(dǎo)入導(dǎo)出

    使用SpringBoot與EasyExcel實(shí)現(xiàn)復(fù)雜的導(dǎo)入導(dǎo)出

    這篇文章主要介紹了使用SpringBoot與EasyExcel實(shí)現(xiàn)復(fù)雜的導(dǎo)入導(dǎo)出,EasyExcel是一個(gè)快速解決大文件內(nèi)存溢出的Excel處理工具,它能讓你在不用考慮性能、內(nèi)存等因素的情況下,快速完成Excel的讀、寫(xiě)等功能,需要的朋友可以參考下
    2023-10-10
  • Springboot自定義mybatis攔截器實(shí)現(xiàn)擴(kuò)展

    Springboot自定義mybatis攔截器實(shí)現(xiàn)擴(kuò)展

    本文主要介紹了Springboot自定義mybatis攔截器實(shí)現(xiàn)擴(kuò)展,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • java實(shí)現(xiàn)excel導(dǎo)出合并單元格的步驟詳解

    java實(shí)現(xiàn)excel導(dǎo)出合并單元格的步驟詳解

    這篇文章主要介紹了java實(shí)現(xiàn)excel導(dǎo)出合并單元格,通過(guò)使用Apache POI庫(kù),我們可以方便地創(chuàng)建Excel文件、填充數(shù)據(jù)、合并單元格和導(dǎo)出Excel文件,需要的朋友可以參考下
    2023-04-04
  • 詳解Java異常處理的使用與思考

    詳解Java異常處理的使用與思考

    異常處理的概念起源于早期的編程語(yǔ)言,如?LISP、PL/I?和?CLU。這些編程語(yǔ)言首次引入了異常處理機(jī)制,以便在程序執(zhí)行過(guò)程中檢測(cè)和處理錯(cuò)誤情況。本文主要來(lái)介紹一下Java中的異常處理,需要的可以參考一下
    2023-04-04
  • 教你如何監(jiān)控 Java 線程池運(yùn)行狀態(tài)的操作(必看)

    教你如何監(jiān)控 Java 線程池運(yùn)行狀態(tài)的操作(必看)

    這篇文章主要介紹了教你如何監(jiān)控 Java 線程池運(yùn)行狀態(tài)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java分支結(jié)構(gòu)程序設(shè)計(jì)實(shí)例詳解

    Java分支結(jié)構(gòu)程序設(shè)計(jì)實(shí)例詳解

    這篇文章主要介紹了Java分支結(jié)構(gòu)程序設(shè)計(jì)例題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • SpringBoot開(kāi)啟異步調(diào)用方法

    SpringBoot開(kāi)啟異步調(diào)用方法

    這篇文章主要為大家詳細(xì)介紹了SpringBoot開(kāi)啟異步調(diào)用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Java中獲取?List中最后一個(gè)元素3種方法以及實(shí)際應(yīng)用

    Java中獲取?List中最后一個(gè)元素3種方法以及實(shí)際應(yīng)用

    這篇文章主要給大家介紹了關(guān)于Java中獲取?List中最后一個(gè)元素3種方法以及實(shí)際應(yīng)用的相關(guān)資料,由于List的索引是從0開(kāi)始的,所以最后一個(gè)元素的索引是List的大小減1,需要的朋友可以參考下
    2023-11-11
  • pagehelper插件顯示total為-1或1的問(wèn)題

    pagehelper插件顯示total為-1或1的問(wèn)題

    這篇文章主要介紹了pagehelper插件顯示total為-1或1,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論