电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Mybatis 一級(jí)緩存與二級(jí)緩存的實(shí)現(xiàn)

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

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

mybatis緩存類型

說(shuō)起mybatis的緩存,了解過(guò)的同學(xué)都知道,mybatis中可以有兩種緩存類型:

第一種,我們通常稱為以及緩存,或者sqlSession級(jí)別的緩存,這種緩存是mybatis自帶的,如果mapper中的配置都是默認(rèn)的話,那么一級(jí)緩存也是默認(rèn)開(kāi)啟的。 第二種,就是非sqlSession級(jí)別的緩存了,我們通常稱為二級(jí)緩存,mybatis中的二級(jí)緩存需要實(shí)現(xiàn)Cache接口,并且配置在mapper中,要先開(kāi)啟的話,需要一些配置,下面我們會(huì)詳細(xì)說(shuō)到。一級(jí)緩存

作為mybatis自帶的緩存,我們通過(guò)代碼來(lái)分析一下其原理。首先,我們來(lái)看下一級(jí)緩存的效果。測(cè)試代碼:

@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配置如下,我們采用默認(rèn)配置:

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

運(yùn)行結(jié)果如下:

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

從上述結(jié)果可以看到,第二次查詢并沒(méi)有從數(shù)據(jù)庫(kù)獲取,并且沒(méi)有從二級(jí)緩存中獲取,由此可見(jiàn),默認(rèn)配置情況下,同一個(gè)sqlSession中會(huì)默認(rèn)使用mybatis的一級(jí)緩存。

下面,我們從mybatis源碼來(lái)看一下:

Mybatis 一級(jí)緩存與二級(jí)緩存的實(shí)現(xiàn)

從上面的代碼中,我們可以看到:一級(jí)緩存是在BaseExecutor中命中的,BaseExecutor中的localCache屬性應(yīng)該就是用來(lái)存儲(chǔ)查詢結(jié)果的。

localCache的定義代碼如下:

Mybatis 一級(jí)緩存與二級(jí)緩存的實(shí)現(xiàn)

Mybatis 一級(jí)緩存與二級(jí)緩存的實(shí)現(xiàn)

從上述代碼可以看出:

BaseExecutor中集成了一級(jí)緩存,一級(jí)緩存為PerpetualCache(永久緩存?)的對(duì)象,其也是實(shí)現(xiàn)了Cache接口的對(duì)象,并且其存儲(chǔ)結(jié)果就是簡(jiǎn)單的HashMap。并且從代碼上來(lái)看,一級(jí)緩存是無(wú)法禁止的。但是如果一個(gè)查詢,我們就是不想讓其從緩存中獲取,必須從數(shù)據(jù)庫(kù)查詢,那我們豈不是無(wú)法處理了?答案必然是否定的,我們從代碼中可以看到:雖然一級(jí)緩存無(wú)法跳過(guò),但是我們可以將緩存中數(shù)據(jù)進(jìn)行清除處理,這樣一級(jí)緩存中就獲取不到結(jié)果集了:

Mybatis 一級(jí)緩存與二級(jí)緩存的實(shí)現(xiàn)

如何讓mybatis每次查詢都flush緩存結(jié)果集呢?答案是通過(guò)mapper配置中的flushCache屬性來(lái)處理:

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

加上這個(gè)屬性后,我們來(lái)看下程序執(zhí)行結(jié)果:

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

可以看到,第二次查詢也檢索了數(shù)據(jù)庫(kù)來(lái)獲取結(jié)果。一級(jí)緩存就說(shuō)到這里吧,下面我們來(lái)看看二級(jí)緩存。

二級(jí)緩存

mybatis的二級(jí)緩存是需要借助第三方的緩存來(lái)實(shí)現(xiàn),常用的有ehcache或者redis,其存儲(chǔ)類型不同,但是在mybatis中的使用方式是一樣的,簡(jiǎn)單處理,我們使用ehcache來(lái)說(shuō)明。通常來(lái)說(shuō),在mybatis中啟用二級(jí)緩存,我們需要以下的步驟:

1、在項(xiàng)目中引入ehcache模塊和mybatis-ehcache模塊

2、在項(xiàng)目中加如ehcache配置文件

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

4、在mapper配置文件中配置cache屬性,并指定緩存的實(shí)現(xiàn)類;

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

第一步:首先我們?cè)陧?xiàng)目中引入相關(guān)模塊:

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

第二步:我們從網(wǎng)上抄一個(gè)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'/>

之前,我們說(shuō)過(guò),mybatis的配置,主要是為了初始化Configuration對(duì)象,從Configuration代碼中我們看到,對(duì)應(yīng)的屬性默認(rèn)值就是為true,因此,此步驟也可以跳過(guò),直接采用mybatis的默認(rèn)值:

Mybatis 一級(jí)緩存與二級(jí)緩存的實(shí)現(xiàn)

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

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

第五步:在statement中開(kāi)啟二級(jí)緩存:

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

測(cè)試代碼如下,為了屏蔽一級(jí)緩存,我們?cè)诘谝淮尾樵兒偷诙尾樵冎袑qlSession進(jìn)行關(guān)閉并重新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();}

執(zhí)行結(jié)果如下:

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

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

下面,我們從mybatis的代碼來(lái)看下二級(jí)緩存使用:

Mybatis 一級(jí)緩存與二級(jí)緩存的實(shí)現(xiàn)

代碼截圖中,我們看到,二級(jí)緩存是在CacheExecutor中進(jìn)行的調(diào)用,并且最終使用的就是我們的Ehcache:

Mybatis 一級(jí)緩存與二級(jí)緩存的實(shí)現(xiàn)

并且,如果我們?cè)趍apper中的statement中也配置了flushCache,那么二級(jí)緩存也將在查詢前被清除掉,我們通過(guò)測(cè)試來(lái)看以下:

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

執(zhí)行結(jié)果如下:

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

總結(jié):

1、mybatis的緩存處理,都交由Executor來(lái)處理,一級(jí)緩存是由BaseExecutor處理,二級(jí)緩存則由CacheExecutor處理;

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

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

到此這篇關(guān)于Mybatis 一級(jí)緩存與二級(jí)緩存的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Mybatis 一級(jí)緩存與二級(jí)緩存內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

相關(guān)文章:
主站蜘蛛池模板: 并离网逆变器_高频UPS电源定制_户用储能光伏逆变器厂家-深圳市索克新能源 | 骨龄仪_骨龄检测仪_儿童骨龄测试仪_品牌生产厂家【品源医疗】 | 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 电机修理_二手电机专家-河北豫通机电设备有限公司(原石家庄冀华高压电机维修中心) | 旋转/数显粘度计-运动粘度测定仪-上海平轩科学仪器 | 西安烟道厂家_排气道厂家_包立管厂家「陕西西安」推荐西安天宇烟道 | 沈阳液压泵_沈阳液压阀_沈阳液压站-沈阳海德太科液压设备有限公司 | 圆盘鞋底注塑机_连帮鞋底成型注塑机-温州天钢机械有限公司 | 进口消泡剂-道康宁消泡剂-陶氏消泡剂-大洋消泡剂 | 齿轮减速电机一体机_蜗轮蜗杆减速马达-德国BOSERL齿轮减速机带电机生产厂家 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 健康管理师报名入口,2025年健康管理师考试时间信息网-网站首页 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 农业仪器网 - 中国自动化农业仪器信息交流平台 | 比亚迪叉车-比亚迪电动叉车堆垛车托盘车仓储叉车价格多少钱报价 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | 蓝牙音频分析仪-多功能-四通道-八通道音频分析仪-东莞市奥普新音频技术有限公司 | 螺旋压榨机-刮泥机-潜水搅拌机-电动泥斗-潜水推流器-南京格林兰环保设备有限公司 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 水热合成反应釜-防爆高压消解罐-西安常仪仪器设备有限公司 | 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 山东臭氧发生器,臭氧发生器厂家-山东瑞华环保设备 | 中矗模型-深圳中矗模型设计有限公司| 硫化罐-胶管硫化罐-山东鑫泰鑫智能装备有限公司 | 纯化水设备-EDI-制药-实验室-二级反渗透-高纯水|超纯水设备 | 甲级防雷检测仪-乙级防雷检测仪厂家-上海胜绪电气有限公司 | 板框压滤机-隔膜压滤机配件生产厂家-陕西华星佳洋装备制造有限公司 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 防爆电机_ybx3系列电机_河南省南洋防爆电机有限公司 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 东莞压铸厂_精密压铸_锌合金压铸_铝合金压铸_压铸件加工_东莞祥宇金属制品 | 郑州宣传片拍摄-TVC广告片拍摄-微电影短视频制作-河南优柿文化传媒有限公司 | 紫外荧光硫分析仪-硫含量分析仪-红外光度测定仪-泰州美旭仪器 | 分子蒸馏设备(短程分子蒸馏装置)_上海达丰仪器 | 太阳能发电系统-太阳能逆变器,控制器-河北沐天太阳能科技首页 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 不锈钢酒柜|恒温酒柜|酒柜定制|酒窖定制-上海啸瑞实业有限公司 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 |