日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Mybatis 一級緩存與二級緩存的實現

瀏覽:43日期:2023-10-19 11:18:59
mybatis緩存

mybatis作為一個流行的持久化工具,緩存必然是缺少不了的組件。通過這篇文章,就讓我們來了解一下mybatis的緩存。

mybatis緩存類型

說起mybatis的緩存,了解過的同學都知道,mybatis中可以有兩種緩存類型:

第一種,我們通常稱為以及緩存,或者sqlSession級別的緩存,這種緩存是mybatis自帶的,如果mapper中的配置都是默認的話,那么一級緩存也是默認開啟的。 第二種,就是非sqlSession級別的緩存了,我們通常稱為二級緩存,mybatis中的二級緩存需要實現Cache接口,并且配置在mapper中,要先開啟的話,需要一些配置,下面我們會詳細說到。一級緩存

作為mybatis自帶的緩存,我們通過代碼來分析一下其原理。首先,我們來看下一級緩存的效果。測試代碼:

@Testpublic void test_Cache() throws Exception { InputStream input = Resources.getResourceAsStream('mybatis-config.xml'); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(input); SqlSession sqlSession = factory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); System.out.println('the first query : '); mapper.queryAllUsers(); System.out.println('===================================='); System.out.println('the second query : '); mapper.queryAllUsers(); sqlSession.commit();}

mapper配置如下,我們采用默認配置:

<select resultType='User'> select * from hwc_users</select>

運行結果如下:

Created connection 1191654595.Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]==> Preparing: select * from hwc_users ==> Parameters: <== Columns: id, name, age, email<== Row: 1, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 2, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 3, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 4, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 5, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 6, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 7, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 8, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 9, 胡文超, 35, huwenchao@cheryfs.cn<== Total: 9====================================the second query : Cache Hit Ratio [com.huwc.mapper.UserMapper]: 0.0

Process finished with exit code 0

從上述結果可以看到,第二次查詢并沒有從數據庫獲取,并且沒有從二級緩存中獲取,由此可見,默認配置情況下,同一個sqlSession中會默認使用mybatis的一級緩存。

下面,我們從mybatis源碼來看一下:

Mybatis 一級緩存與二級緩存的實現

從上面的代碼中,我們可以看到:一級緩存是在BaseExecutor中命中的,BaseExecutor中的localCache屬性應該就是用來存儲查詢結果的。

localCache的定義代碼如下:

Mybatis 一級緩存與二級緩存的實現

Mybatis 一級緩存與二級緩存的實現

從上述代碼可以看出:

BaseExecutor中集成了一級緩存,一級緩存為PerpetualCache(永久緩存?)的對象,其也是實現了Cache接口的對象,并且其存儲結果就是簡單的HashMap。并且從代碼上來看,一級緩存是無法禁止的。但是如果一個查詢,我們就是不想讓其從緩存中獲取,必須從數據庫查詢,那我們豈不是無法處理了?答案必然是否定的,我們從代碼中可以看到:雖然一級緩存無法跳過,但是我們可以將緩存中數據進行清除處理,這樣一級緩存中就獲取不到結果集了:

Mybatis 一級緩存與二級緩存的實現

如何讓mybatis每次查詢都flush緩存結果集呢?答案是通過mapper配置中的flushCache屬性來處理:

<select resultType='User' flushCache='true'> select * from hwc_users</select>

加上這個屬性后,我們來看下程序執行結果:

Created connection 1191654595.Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]==> Preparing: select * from hwc_users ==> Parameters: <== Columns: id, name, age, email<== Row: 1, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 2, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 3, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 4, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 5, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 6, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 7, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 8, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 9, 胡文超, 35, huwenchao@cheryfs.cn<== Total: 9====================================the second query : Cache Hit Ratio [com.huwc.mapper.UserMapper]: 0.0==> Preparing: select * from hwc_users ==> Parameters: <== Columns: id, name, age, email<== Row: 1, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 2, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 3, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 4, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 5, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 6, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 7, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 8, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 9, 胡文超, 35, huwenchao@cheryfs.cn<== Total: 9

Process finished with exit code 0

可以看到,第二次查詢也檢索了數據庫來獲取結果。一級緩存就說到這里吧,下面我們來看看二級緩存。

二級緩存

mybatis的二級緩存是需要借助第三方的緩存來實現,常用的有ehcache或者redis,其存儲類型不同,但是在mybatis中的使用方式是一樣的,簡單處理,我們使用ehcache來說明。通常來說,在mybatis中啟用二級緩存,我們需要以下的步驟:

1、在項目中引入ehcache模塊和mybatis-ehcache模塊

2、在項目中加如ehcache配置文件

3、在mybatis配置文件中我們需要在setting中配置cacheEnabled屬性;

4、在mapper配置文件中配置cache屬性,并指定緩存的實現類;

5、在statement中配置useCache屬性為”true“

第一步:首先我們在項目中引入相關模塊:

<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.0</version></dependency><dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.2.1</version></dependency>

第二步:我們從網上抄一個ehcache的配置文件:ehcache.xml

<?xml version='1.0' encoding='UTF-8'?><ehcache xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='http://ehcache.org/ehcache.xsd' updateCheck='false'> <diskStore path='java.io.tmpdir'/> <defaultCache eternal='false' maxElementsInMemory='1000' overflowToDisk='false' diskPersistent='false' timeToIdleSeconds='0' timeToLiveSeconds='600' memoryStoreEvictionPolicy='LRU'/></ehcache>

第三步:配置mybatis屬性

<setting name='cacheEnabled' value='true'/>

之前,我們說過,mybatis的配置,主要是為了初始化Configuration對象,從Configuration代碼中我們看到,對應的屬性默認值就是為true,因此,此步驟也可以跳過,直接采用mybatis的默認值:

Mybatis 一級緩存與二級緩存的實現

第四步:配置mapper中的緩存屬性:

<mapper namespace='com.huwc.mapper.UserMapper'> <cache type='org.mybatis.caches.ehcache.EhcacheCache'></cache> ......</mapper>

第五步:在statement中開啟二級緩存:

<select resultType='User' useCache='true'> select * from hwc_users</select>

測試代碼如下,為了屏蔽一級緩存,我們在第一次查詢和第二次查詢中將sqlSession進行關閉并重新open:

@Testpublic void test_Cache() throws Exception { InputStream input = Resources.getResourceAsStream('mybatis-config.xml'); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(input); SqlSession sqlSession = factory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); System.out.println('the first query : '); mapper.queryAllUsers(); sqlSession.close(); sqlSession = factory.openSession(); mapper = sqlSession.getMapper(UserMapper.class); System.out.println('===================================='); System.out.println('the second query : '); mapper.queryAllUsers(); sqlSession.commit();}

執行結果如下:

Created connection 1191654595.Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]==> Preparing: select * from hwc_users ==> Parameters: <== Columns: id, name, age, email<== Row: 1, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 2, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 3, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 4, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 5, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 6, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 7, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 8, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 9, 胡文超, 35, huwenchao@cheryfs.cn<== Total: 9Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]Returned connection 1191654595 to pool.====================================the second query : Cache Hit Ratio [com.huwc.mapper.UserMapper]: 0.5

Process finished with exit code 0

從結果中,我們可以看到,二級緩存起到了作用,并且命中率為0.5(查詢兩次,一次命中)

下面,我們從mybatis的代碼來看下二級緩存使用:

Mybatis 一級緩存與二級緩存的實現

代碼截圖中,我們看到,二級緩存是在CacheExecutor中進行的調用,并且最終使用的就是我們的Ehcache:

Mybatis 一級緩存與二級緩存的實現

并且,如果我們在mapper中的statement中也配置了flushCache,那么二級緩存也將在查詢前被清除掉,我們通過測試來看以下:

<select resultType='User' flushCache='true' useCache='true'> select * from hwc_users</select>

執行結果如下:

Created connection 1191654595.Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]==> Preparing: select * from hwc_users ==> Parameters: <== Columns: id, name, age, email<== Row: 1, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 2, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 3, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 4, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 5, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 6, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 7, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 8, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 9, 胡文超, 35, huwenchao@cheryfs.cn<== Total: 9Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]Returned connection 1191654595 to pool.====================================the second query : Cache Hit Ratio [com.huwc.mapper.UserMapper]: 0.5Opening JDBC ConnectionChecked out connection 1191654595 from pool.Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]==> Preparing: select * from hwc_users ==> Parameters: <== Columns: id, name, age, email<== Row: 1, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 2, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 3, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 4, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 5, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 6, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 7, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 8, 胡文超, 35, huwenchao@cheryfs.cn<== Row: 9, 胡文超, 35, huwenchao@cheryfs.cn<== Total: 9

Process finished with exit code 0

總結:

1、mybatis的緩存處理,都交由Executor來處理,一級緩存是由BaseExecutor處理,二級緩存則由CacheExecutor處理;

2、statement中如果配置了flushCache為true,那么不論是一級緩存還是二級緩存都會失效;

3、要啟用二級緩存,需要在statement中配置useCache為true。

到此這篇關于Mybatis 一級緩存與二級緩存的實現的文章就介紹到這了,更多相關Mybatis 一級緩存與二級緩存內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩一区二区三区视频播放| 99久久久久国产精品| 日韩精品欧美激情一区二区| 国产精品黄网站| 日本成人在线不卡视频| 蜜桃视频第一区免费观看| 午夜一级在线看亚洲| 久久一区二区三区电影| 在线精品亚洲欧美日韩国产| 日韩av首页| 不卡中文字幕| 亚洲精选91| 国产无遮挡裸体免费久久| 欧美黄色一区| 精品一区二区男人吃奶| 成人国产精品一区二区网站| 久久久精品网| 亚洲一区免费| 国产欧美激情| 97se综合| 亚洲精品护士| 成人日韩av| 亚洲一区二区三区高清| 国产亚洲精品精品国产亚洲综合| 国产中文在线播放| 亚洲一区二区成人| 精品国产亚洲日本| 在线亚洲欧美| 国产suv精品一区二区四区视频| 精品国产第一福利网站| 亚洲精品99| 精品99在线| 亚洲aⅴ网站| 99久久激情| 精品亚洲自拍| 日韩高清在线观看一区二区| 99久久激情| 国内揄拍国内精品久久| 久久先锋影音| 色吊丝一区二区| 国产极品模特精品一二 | 夜鲁夜鲁夜鲁视频在线播放| 亚洲tv在线| 伊人久久大香线蕉av不卡| 国产精品二区不卡| 99成人在线| 久久激情婷婷| 国产精品福利在线观看播放| 国产日韩三级| 日产欧产美韩系列久久99| 激情婷婷综合| 91精品观看| 亚洲v在线看| а√天堂8资源中文在线| 久久丁香四色| 国产精品免费大片| 欧美日韩一区二区高清| 亚洲2区在线| 欧美日韩国产免费观看| 91精品啪在线观看国产18| 三级在线看中文字幕完整版| 夜鲁夜鲁夜鲁视频在线播放| 中文在线а√在线8| 97精品国产| 99热精品久久| 美女久久网站| 日韩三级精品| 91福利精品在线观看| 日韩精品欧美成人高清一区二区| 免费美女久久99| 欧美三区不卡| 精品九九久久| 日韩精品水蜜桃| 激情久久五月| 免费成人av在线播放| 日本aⅴ免费视频一区二区三区| 国产精品亚洲欧美日韩一区在线| 麻豆精品视频在线| 91精品亚洲| 日韩在线网址| 久久久久久婷| 欧美日韩国产在线一区| 亚洲精选久久| 麻豆国产欧美日韩综合精品二区| 女生影院久久| 综合激情网...| 九九久久国产| 人人精品人人爱| 国产精品久久777777毛茸茸| 欧美xxxx中国| 免费不卡在线观看| 麻豆mv在线观看| 五月亚洲婷婷 | 亚洲欧美日韩国产一区二区| 日本欧美大码aⅴ在线播放| 国产福利片在线观看| 国产精品免费看| 精品香蕉视频| 日韩精彩视频在线观看| 久久国产电影| 久久99免费视频| 日韩一区免费| 国产精品13p| 婷婷久久免费视频| 激情综合自拍| 国产一区二区三区网| 亚洲精品乱码日韩| 免费毛片在线不卡| 亚洲国产成人二区| 国产精品成人自拍| 综合国产在线| 色婷婷精品视频| 欧美国产极品| 国产精品亚洲欧美一级在线| 石原莉奈在线亚洲二区| 中文字幕在线官网| 国产在线视频欧美一区| 国产精品欧美三级在线观看| 蜜臀精品一区二区三区在线观看| 亚洲www啪成人一区二区| 久久三级毛片| 久久亚洲人体| 欧美国产极品| 国产精品亚洲二区| 国产精品久久久久久久久久白浆 | 国产精品99久久精品| 美女性感视频久久| 麻豆国产精品视频| 91成人在线精品视频| 欧美亚洲人成在线| 亚洲精品伦理| 日韩高清不卡一区二区| 亚洲麻豆一区| 97精品资源在线观看| 日韩精品免费视频人成 | 国精品一区二区三区| 美女少妇全过程你懂的久久| 精品一区亚洲| 人人爽香蕉精品| 日韩精品一区二区三区av| 7m精品国产导航在线| 久久久久亚洲精品中文字幕| 国产精品啊v在线| 高清av一区| 尤物网精品视频| 婷婷综合一区| 国产一区二区三区网| 婷婷丁香综合| 国产精品天堂蜜av在线播放| 国产一区二区三区久久 | 99日韩精品| 日韩不卡一区二区| 亚洲精品88| 在线日韩成人| 精品国产a一区二区三区v免费| 欧美片网站免费| 97精品国产| 日韩三级久久| 亚洲性色av| 欧美一级二级三级视频| 日产精品一区| 国产精品久久久久久妇女| 国产专区一区| 精品午夜av| 亚洲免费专区| 国内亚洲精品| 免费一区二区三区在线视频| 9色国产精品| 久久精品国产成人一区二区三区| 欧美日韩在线二区| 精品久久福利| 欧美欧美黄在线二区| 狠狠色狠狠色综合日日tαg| 精品视频高潮| 日韩成人精品一区二区三区 | 国产麻豆一区| 久久午夜精品一区二区| 999国产精品999久久久久久| 不卡中文字幕| 国内一区二区三区| 青青草国产成人99久久| 日韩视频在线一区二区三区| 国产精品一区二区精品| 国产精品毛片一区二区三区| 91精品啪在线观看国产18| 国产伊人久久| 精品国产黄a∨片高清在线| 97成人在线| 日本中文字幕一区二区| 亚洲精品系列| 三级久久三级久久久| 九色porny丨国产首页在线| 日韩在线高清| 国产欧美自拍一区| 欧美在线观看视频一区| 国产精品免费99久久久| 日韩精品午夜视频| 亚洲精选成人| 日韩福利一区| 高清不卡一区|