MyBatis緩存通俗易懂

1.1???? mybatis緩存介紹

如下圖,是mybatis一級緩存和二級緩存的區別圖解:

?

Mybatis一級緩存的作用域是同一個SqlSession,在同一個sqlSession中兩次執行相同的sql語句,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。當一個sqlSession結束后該sqlSession中的一級緩存也就不存在了。當遇到增刪改時會清空緩存。Mybatis默認開啟一級緩存。

Mybatis二級緩存是多個SqlSession共享的,其作用域是mapper的同一個namespace,不同的sqlSession兩次執行相同namespace下的sql語句且向sql中傳遞參數也相同即最終執行相同的sql語句,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。當遇到增刪改時會清空緩存。Mybatis默認沒有開啟二級緩存需要在setting全局參數中配置開啟二級緩存。

?

?

1.2???? 一級緩存

1.2.1? 原理

下圖是根據id查詢用戶的一級緩存圖解:

?

一級緩存區域是根據SqlSession為單位劃分的。

每次查詢會先從緩存區域找,如果找不到從數據庫查詢,查詢到數據將數據寫入緩存。

Mybatis內部存儲緩存使用一個HashMap,key為hashCode+sqlId+Sql語句。value為從查詢出來映射生成的java對象

sqlSession執行insert、update、delete等操作commit提交后會清空緩存區域。

?

1.2.2? 測試1

//獲取session
SqlSession session = sqlSessionFactory.openSession();//獲限mapper接口實例
UserMapper userMapper = session.getMapper(UserMapper.class);//第一次查詢
User user1 = userMapper.findUserById(1);System.out.println(user1);//第二次查詢,由于是同一個session則不再向數據發出語句直接從緩存取出
User user2 = userMapper.findUserById(1);System.out.println(user2);//關閉session
session.close();

?

1.2.3? 測試2

?

//獲取session
SqlSession session = sqlSessionFactory.openSession();//獲限mapper接口實例
UserMapper userMapper = session.getMapper(UserMapper.class);//第一次查詢
User user1 = userMapper.findUserById(1);System.out.println(user1);//在同一個session執行更新
User user_update = new User();user_update.setId(1);user_update.setUsername("李奎");userMapper.updateUser(user_update);session.commit();//第二次查詢,雖然是同一個session但是由于執行了更新操作session的緩存被清空,這里重新發出sql操作
User user2 = userMapper.findUserById(1);System.out.println(user2);

?

1.3???? 二級緩存

1.3.1? 原理

下圖是多個sqlSession請求UserMapper的二級緩存圖解。

?

?

二級緩存區域是根據mapper的namespace劃分的,相同namespace的mapper查詢數據放在同一個區域,如果使用mapper代理方法每個mapper的namespace都不同,此時可以理解為二級緩存區域是根據mapper劃分。

每次查詢會先從緩存區域找,如果找不到從數據庫查詢,查詢到數據將數據寫入緩存。

Mybatis內部存儲緩存使用一個HashMap,key為hashCode+sqlId+Sql語句。value為從查詢出來映射生成的java對象

sqlSession執行insert、update、delete等操作commit提交后會清空緩存區域。

?

?

1.3.2? 開啟二級緩存:

在核心配置文件SqlMapConfig.xml中加入

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

?

?

描述

允許值

默認值

cacheEnabled

對在此配置文件下的所有cache 進行全局性開/關設置。

true false

true

?

?

要在你的Mapper映射文件中添加一行:??<cache?/>?,表示此mapper開啟二級緩存。

?

1.3.3? 實現序列化

???????? 二級緩存需要查詢結果映射的pojo對象實現java.io.Serializable接口實現序列化和反序列化操作,注意如果存在父類、成員pojo都需要實現序列化接口。

???????? public class Orders implements Serializable

???????? public class User implements Serializable

???????? ....

?

1.3.4? 測試

?

//獲取session1
SqlSession session1 = sqlSessionFactory.openSession();UserMapper userMapper = session1.getMapper(UserMapper.class);//使用session1執行第一次查詢
User user1 = userMapper.findUserById(1);System.out.println(user1);//關閉session1
session1.close();//獲取session2
SqlSession session2 = sqlSessionFactory.openSession();UserMapper userMapper2 = session2.getMapper(UserMapper.class);//使用session2執行第二次查詢,由于開啟了二級緩存這里從緩存中獲取數據不再向數據庫發出sql
User user2 = userMapper2.findUserById(1);System.out.println(user2);//關閉session2
session2.close();

?

1.3.5? 禁用二級緩存

在statement中設置useCache=false可以禁用當前select語句的二級緩存,即每次查詢都會發出sql去查詢,默認情況是true,即該sql使用二級緩存。

<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">

?

1.3.6? 刷新緩存

在mapper的同一個namespace中,如果有其它insert、update、delete操作數據后需要刷新緩存,如果不執行刷新緩存會出現臟讀。

?

?設置statement配置中的flushCache="true"?屬性,默認情況下為true即刷新緩存,如果改成false則不會刷新。使用緩存時如果手動修改數據庫表中的查詢數據會出現臟讀。

如下:

<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User" flushCache="true">

轉載于:https://www.cnblogs.com/xiaolovewei/p/9427016.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279683.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279683.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279683.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DVbbs8.2入侵思路與總結

dvbbs8.2后比較變態&#xff0c;目前還沒有特別好的方法&#xff0c;外面有人提到一種方法就是直接上傳php文件或者其它服務器支持文件&#xff0c;這個也是一個思路&#xff0c;不過很多時候&#xff0c;單獨的服務器不會支持這么多。dvbbs禁用了asp和asp.net的上傳&#xff0…

Python基礎教程:Python pass語句詳解

2019獨角獸企業重金招聘Python工程師標準>>> Python pass 語句 Python pass是空語句&#xff0c;是為了保持程序結構的完整性。 pass 不做任何事情&#xff0c;一般用做占位語句。 Python 語言 pass 語句語法格式如下&#xff1a; 實例&#xff1a; 學習從來不是一個…

Oracle數據庫在Nokia

Nokia固然今非昔比&#xff0c;但在手機市場仍是未瘦死的駱駝&#xff0c;有關報道顯示Nokia現役的數據庫(包括Oracle、MySQL、MSSQL)達到2300套之多&#xff0c; DBA團隊共有20多人&#xff0c;平均每人100多套庫。 Grid Control在過去5年中是最主要的、也幾乎是唯一的DBA管理…

css animation動畫

css 動畫&#xff1a; 動畫是CSS3中具有顛覆性的特征之一&#xff0c;可通過設置多個節點來精確控制一個或一組動畫&#xff0c;常用來實現復雜的動畫效果. 必要元素&#xff1a;a、通過keyframes指定動畫序列&#xff1b;自動補間動畫&#xff0c;確定兩個點&#xff0c;系統會…

甘特圖看起來很生硬?教你使用智能顏色裝飾你的甘特圖!(二)

在上一篇文章中我們了解到顏色在甘特圖中也有不同的作用。其中顏色在甘特圖中扮演著三個角色&#xff0c;才能使甘特圖對用戶有意義。 顏色決定甘特圖的外觀。顏色還可以用來定義甘特圖的語義。因此&#xff0c;它們幫助用戶更快地理解甘特圖所呈現的完整且常常復雜的現實。顏色…

網絡串流_串流NFL足球的最便宜方式(無需電纜)

網絡串流Football season is almost upon us. That means one thing: expensive cable or satellite TV packages. Okay, it also means beer commercials and overpriced stadium tickets and quarterbacks trying to sell you car insurance. But in terms of immediate cost…

【高清】網絡安全思維導圖

本文轉自 是阿杰啊 51CTO博客&#xff0c;原文鏈接:http://blog.51cto.com/jschinamobile/1969018

生成函數初探

對給定序列\(\{a_{0,1,2,\cdots}\}\) 構造一個函數\(F(x)\sum_{i0,1,2,\cdots}a_if_i(x)\)&#xff0c;稱\(F(x)\)為序列\(\{a_{0,1,2,\cdots}\}\)的生成函數。其中&#xff0c;序列\(\{f_{0,1,2,\cdots}(x)\}?\)只作為標志用&#xff0c;稱為標志函數。 普通型生成函數(OGF) …

Pixel相機是怎么做到自動補抓最不錯的自拍照

網絡大廠 AI研究團隊近日在最新的Pixel相機中&#xff0c;于無快門模式Photobooth新增親吻偵測功能&#xff0c;當用戶親吻自己的愛人時&#xff0c;相機會自動捕捉這一瞬間。網絡大廠過去是藉由Photobooth模式&#xff0c;讓用戶更簡單地成功自拍&#xff0c;不管是一個人、情…

os x 啟動引導_什么是OS X的啟動板以及它如何工作?

os x 啟動引導If you’re new to OS X, or even if you’re not and you’re simply used to pinning everything to the Dock, you might have wondered what Launchpad is, what it does, and how to use it. 如果您不熟悉OS X&#xff0c;或者即使您不熟悉OS X&#xff0c;而…

freeradius的proxy功能

要配置freeRADIUS的proxy功能&#xff0c;就需要熟悉它的兩個配置文件&#xff1a;proxy.conf 和client.conf。 1. proxy.conf主要是用來配置被代理的radius server&#xff08;也叫home server&#xff09; 和 realm&#xff0c; 以及他們之間的映射關系&#xff0c;也就是req…

小程序 iphone和安卓_如何阻止iPhone和iPad應用程序要求評級

小程序 iphone和安卓Lots of iPhone and iPad apps ask for ratings, and they often don’t stop. Even if you do leave a review just to stop seeing the review requests, new apps you install will pester you for reviews, too. iOS 11 fixes this problem, limiting h…

一篇年薪60萬的JVM性能調優文章

2019獨角獸企業重金招聘Python工程師標準>>> JVM 調優概述 性能定義 吞吐量 - 指不考慮 GC 引起的停頓時間或內存消耗&#xff0c;垃圾收集器能支撐應用達到的最高性能指標。延遲 - 其度量標準是縮短由于垃圾啊收集引起的停頓時間或者完全消除因垃圾收集所引起的停頓…

yum 出錯,提示Segmentation Fault (core Dumped) 的解決辦法

CentOS5.5部署Zlib導致yum使用不了&#xff0c;報錯Yum Segmentation Fault (core Dumped) 。 在一臺CentOS.5.5的機器上使用Yum時突然報錯&#xff0c;提示Yum Segmentation Fault (core Dumped) &#xff1b;并產生core.*文件 解決辦法&#xff1a; # rpm -q zlib zlib-devel…

手機主題隨手機殼改變_無線充電可以與手機殼一起使用嗎?

手機主題隨手機殼改變With wireless charging making its way into the new iPhones, there are undoubtedly a lot of questions floating around about how this technology works in practical application. The biggest question I’ve heard so far is: will it work with…

求連續序列的最大子序列和

求一個序列的最大子序列和&#xff0c;這個可以有幾種方法都可以去求解&#xff0c;這里我提供兩種方法給大家。 假如這個序列是{1&#xff0c;-2&#xff0c;3&#xff0c;4}&#xff0c;顯然最大子序列和是7&#xff0c;那么這個要怎么去計算呢&#xff1f; 第一種方法就是順…

Go語言與數據庫開發:01-09

包和工具 Go語言有超過100個的標準包&#xff08;譯注&#xff1a;可以用 go list std | wc -l 命令查看標準包的具體數目&#xff09;&#xff0c;標準庫為大多數的程序提供了必要的基礎構件。在Go的社區&#xff0c;有很多成熟的包被設計、共享、重用和改進&#xff0c;目前互…

android 文本后圖標_如何在Android中更改文本,圖標等的大小

android 文本后圖標Let’s face it: no matter how good the screens are on our phones and tablets, the text can sometimes be too tiny if you have poor eyesight. The good news is that there are a variety of methods to help you alleviate squinting just to make …

Code Chef February Challenge 2019題解

傳送門 \(HMAPPY2\) 咕 話說這題居然卡\(scanf\)的么&#xff1f;&#xff1f;&#xff1f; int T;cin>>T; while(T--){cin>>n>>a>>b>>k;puts(n/an/b-n/(a*b/__gcd(a,b))*2>k?"Win":"Lose"); } \(CHEFING\) 咕咕 int T;…

Linux文本查看命令之uniq

uniq是專用的去重命令限制&#xff1a;必須相鄰的兩行內容相同才算是重復&#xff0c;如果內容相同&#xff0c;但是兩行之間有其他內容就不算重復。使用uniq命令先排序&#xff0c;再去重。-d 的選項是用來僅顯示重復行的-u 僅顯示不重復的行-c 統計每一行出現的次數本文轉自 …