日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mybatis缓存机制

發布時間:2025/5/22 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis缓存机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 緩存介紹
  • 一級緩存
    • 二級緩存
      • 二級緩存使用步驟
    • 二級緩存和一級緩存的區別:

緩存介紹

緩存主要是對查詢起作用,減輕數據庫的壓力,提高數據庫的性能
mybatis中提供了一級緩存、二級緩存

一級緩存是SQLSession級別的緩存,同一個SQLSession上的查詢可以使用一級緩存,不同的SQLSession緩存是相互獨立的,互不影響

二級緩存是mapper級別的緩存,多個SQLSession會命中二級緩存,及二級緩存可以在多個SQLSession之間共享

一級緩存

一級緩存是SQLSession級別緩存,一級緩存的作用域是一個SQLSession,在同一個sqlsession下兩次執行相同的SQL查詢操作,第一次執行完畢后會將數據庫中查詢的數據寫入緩存,第二次會從緩存中獲取數據則不從數據庫中獲取,提高查詢效率,當SQLSession結束,緩存也就隨之失效
mybatis是默認開啟一級緩存


注意:緩存起作用是對同一個數據而言,必須是連續的查詢操作,第一次操作之后緩存會起作用,在第一次查詢之后對同一個數據做變更/刪除操作,緩存會被清空,后續查詢中的第一個查詢是需要到數據庫查詢

一級緩存測試:

mybatis默認支持的,不需要配置

同一個session下連續查詢操作:

二級緩存

mybatis的二級緩存是mapper級別的緩存,默認是關閉的
對同一個mapper其不同的SQLSession可以共享二級緩存,不同的mapper是相互獨立的

二級緩存的使用需要打開二級緩存配置,映射的java對象實現序列化

二級緩存使用步驟

1、在mybatis的全局配置文件中打開二級緩存的開關

<settings><!--二級緩存的配置信息--><setting name="cacheEnabled " value="true"/></settings>

2、將映射的對象實現序列化

public class Student implements Serializable

3、在mapper中使用cache標簽

<!--cache標簽flushInterval(刷新時間) 是正整數,單位是毫秒,默認不設置,即沒有刷新時間size(引用數據) 正整數,默認1024,記錄是緩存的對象的數目readOnly(只讀) eviction:給定緩存回收策略LRU:最近最少使用的,移除長時間不使用緩存對象FIFO:先進先出,按照對象進入緩存的順序來移除對象soft:軟引用:移除基于垃圾回收狀態和軟引用規則的對象weak:弱引用:移除弱引用所作用的對象--><cache flushInterval="60000" size="512" readOnly="true" eviction="LRU"/>

二級緩存的測試:

useCache:配置禁用緩存
在Statement上設置useCache="false"禁用select查詢的二級緩存,即每次查詢都會去數據庫,不使用二級緩存

二級緩存和一級緩存的區別:

二級緩存的范圍更大,多個SQLSession可以共享一個mapper中的二級緩存,
每一個mapper都有一個二級緩存,如果mapper的namespace如果相同,這兩個mapper執行查詢SQL查詢到的數據將存在相同的二級緩存區域中

一級緩存,二級緩存 SQLSession->defaultSqlSession ->CachingExecutor
一級緩存:LocalCache
二級緩存:tcm
執行優先級源碼

public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {Cache cache = ms.getCache();if (cache != null) {//是否為二級緩存this.flushCacheIfRequired(ms);if (ms.isUseCache() && resultHandler == null) {this.ensureNoOutParams(ms, parameterObject, boundSql);List<E> list = (List)this.tcm.getObject(cache, key);if (list == null) {list = this.delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);this.tcm.putObject(cache, key, list);}return list;}}return this.delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);}

總結

以上是生活随笔為你收集整理的mybatis缓存机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。