最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
怎么在Springboot2.0通過redis實(shí)現(xiàn)支持分布式的mybatis二級(jí)緩存

這篇文章主要介紹“怎么在Springboot2.0通過redis實(shí)現(xiàn)支持分布式的mybatis二級(jí)緩存”,在日常操作中,相信很多人在怎么在Springboot2.0通過redis實(shí)現(xiàn)支持分布式的mybatis二級(jí)緩存問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”怎么在Springboot2.0通過redis實(shí)現(xiàn)支持分布式的mybatis二級(jí)緩存”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、安澤ssl等。為千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的安澤網(wǎng)站制作公司

最近領(lǐng)導(dǎo)要求在項(xiàng)目中加下mybatis二級(jí)緩存,由于當(dāng)前項(xiàng)目是分布式微服務(wù),且是多節(jié)點(diǎn)部署的,而司內(nèi)緩存中間件使用的redis,那很自然的要用redis做分布式緩存支持,避免出現(xiàn)直接使用原生mybatis二級(jí)緩存造成緩存數(shù)據(jù)不一致等問題。下面會(huì)對(duì)基于redis的mybatis二級(jí)緩存實(shí)現(xiàn)做下簡單介紹,涉及一些概念,同時(shí)一些坑點(diǎn)做下整理。

1. 一級(jí)緩存

一級(jí)緩存是在SqlSession級(jí)別的緩存,MyBatis默認(rèn)開啟一級(jí)緩存。即同一個(gè)SqlSession對(duì)象,相同參數(shù)多次調(diào)用同一個(gè)Mapper方法時(shí),只執(zhí)行一次SQL,第一次查詢后數(shù)據(jù)被緩存起來,之后的調(diào)用在沒有緩存刷新、超時(shí)情況下都是直接先從緩存中取數(shù)據(jù),不再去查數(shù)據(jù)庫。不同SqlSession間,緩存是隔離的。

怎么在Springboot2.0通過redis實(shí)現(xiàn)支持分布式的mybatis二級(jí)緩存

此外實(shí)際項(xiàng)目開發(fā)中,一級(jí)緩存存在很大的局限性,我們的項(xiàng)目一般是Spring+Mybatis集成開發(fā),而Spring的事務(wù)管理在邏輯層,每個(gè)service對(duì)應(yīng)不同的SqlSession(這是通過MapperScannerConfigurer類創(chuàng)建SqlSession自動(dòng)注入到service中的), 每次查詢之后都會(huì)關(guān)閉SqlSession,緩存數(shù)據(jù)就會(huì)被清空。所以Spring整合之后,如果沒有事務(wù),一級(jí)緩存是沒有實(shí)際意義的。

2. 二級(jí)緩存

二級(jí)緩存是Mapper級(jí)別的緩存,Mybatis默認(rèn)不開啟二級(jí)緩存。二級(jí)緩存的作用域是mapper的namespace,即相同namespace的兩個(gè)mapper將共用同一緩存區(qū)域;支持跨SqlSession,即多個(gè)SqlSession可以共享一個(gè)mapper緩存。實(shí)現(xiàn)上是基于PerpetualCache的HashMap做本地存儲(chǔ),也支持自定義三方存儲(chǔ)如ehcache、redis、memcache等,用于支持分布式。在本地使用HashMap存儲(chǔ)緩存時(shí),key為hashCode+sqlId+Sql語句(查詢參數(shù)好像也參與,demo用的selectAll,沒怎么關(guān)注),其他三方存儲(chǔ)時(shí)key也差不多。

怎么在Springboot2.0通過redis實(shí)現(xiàn)支持分布式的mybatis二級(jí)緩存

注意:開啟二級(jí)緩存后

  • 所有在映射文件里的select 語句都將被緩存。

  • 所有在映射文件里insert,update 和delete 語句會(huì)清空緩存。

  • 緩存默認(rèn)使用“最近很少使用”LRU算法來回收

  • 緩存不會(huì)被設(shè)定的時(shí)間所清空。

  • 每個(gè)緩存可以存儲(chǔ)1024 個(gè)列表或?qū)ο蟮囊茫ú还懿樵兂鰜淼慕Y(jié)果是什么)。

  • 緩存將作為“讀/寫”緩存,意味著獲取的對(duì)象不是共享的且對(duì)調(diào)用者是安全的。不會(huì)有其它的調(diào)用干擾其他調(diào)用者或線程所做的潛在修改

實(shí)現(xiàn)步驟:

1、全局cache-enable開關(guān)設(shè)置,此開關(guān)默認(rèn)為true(實(shí)踐證明不設(shè)置也行)

  • 創(chuàng)建mybatis-config.xml的配置文件

  • Mybatis配置SqlSessionFactory時(shí)加載該配置

factory.setConfigLocation(new ClassPathResource("mybatis-config.xml"));

注:通過mybatis-config.xml配置緩存開關(guān),驗(yàn)證啟停正常;通過配置屬性mybatis.configuration.cache-enabled=true的設(shè)置不起作用,原因有待探究

2、mapper.xml中緩存標(biāo)簽的開啟

  • 這是二級(jí)緩存開啟的關(guān)鍵,如下配置是mybatis本地緩存,作用于整個(gè)mapper的所有查詢,若某個(gè)       SELECT * FROM table WHERE user_id = #{userId}   

    3、Model實(shí)體類需要做序列化

    public class User implements Serializable{
       private static final long serialVersionUID = -6596381461353742505L;
       ...
    
    }

    本文是以redis作為存儲(chǔ)介質(zhì),在redis配置時(shí)即指定了key、value的序列化方式,所以我在這步時(shí)實(shí)體類上序列化可有可無(也有人說即使本地緩存也不需要)

    執(zhí)行示例結(jié)果:

    怎么在Springboot2.0通過redis實(shí)現(xiàn)支持分布式的mybatis二級(jí)緩存

    坑點(diǎn)整理:

    在第二步實(shí)現(xiàn)時(shí),我用了標(biāo)簽來開啟二級(jí)緩存,此處還可以在mybatis的mapper接口類上使用等效注解來開啟二級(jí)緩存,注解如下:

    @CacheNamespace(implementation = com.xxx.xxx.configs.MybatisRedisCache.class)

    但使用注解和xml中標(biāo)簽不能同時(shí)作用,也就是說使用注解時(shí),只能在Mapper接口的方法上用@Select注解綁定執(zhí)行SQL,緩存才有效;同樣使用標(biāo)簽,則只能在mapper.xml中定義

    <fieldset id="u2ggg"></fieldset>
    <fieldset id="u2ggg"><table id="u2ggg"></table></fieldset>
    <strike id="u2ggg"><input id="u2ggg"></input></strike>