當前位置:首頁 » 文件管理 » mybatis緩存配置

mybatis緩存配置

發布時間: 2024-06-08 13:15:10

A. mybatis有必要用redis作緩存

通常為了減輕資料庫的壓力,我們會引入緩存。在Dao查詢資料庫之前,先去緩存中找是否有要找的數據,如果有則用緩存中的數據即可,就不用查詢數
據庫了。如果沒有才去資料庫中查找。這樣就能分擔一下資料庫的壓力。另外,為了讓緩存中的數據與資料庫同步,我們應該在該數據發生變化的地方加入更新緩存
的邏輯代碼。這樣無形之中增加了工作量,同時也是一種對原有代碼的入侵。這對於有著代碼潔癖的程序員來說,無疑是一種傷害。

MyBatis框架早就考慮到了這些問題,因此MyBatis提供了自定義的二級緩存概念,方便引入我們自己的緩存機制,而不用更改原有的業務邏輯。

B. mybatis的緩存機制是怎麼樣的

MyBatis將數據緩存設計成兩級結構,分為一級緩存、二級緩存:
一級緩存是Session會話級別的緩存,位於表示一次資料庫會話的sqlSession對象之中,又被稱之為本地緩存。一級緩存是MyBatis內部實現的一個特性,用戶不能配置,默認情況下自動支持的緩存,用戶沒有定製它的權利(不過這也不是絕對的,可以通過開發插件對它進行修改);
二級緩存是Application應用級別的緩存,它的是生命周期很長,跟Application的聲明周期一樣,也就是說它的作用范圍是整個Application應用。

C. mybatis的緩存機制是怎麼樣的

Mybatis緩存處理機制
MyBatis緩存介紹
正如大多數持久層框架一樣,MyBatis 同樣提供了一級緩存和二級緩存的支持
一級緩存: 基於PerpetualCache 的 HashMap本地緩存,其存儲作用域為 Session,當 Session flush 或 close 之後,該Session中的所有 Cache 就將清空。
2. 二級緩存與一級緩存其機制相同,默認也是採用 PerpetualCache,HashMap存儲,不同在於其存儲作用域為 Mapper(Namespace),並且可自定義存儲源,如 Ehcache。
3. 對於緩存數據更新機制,當某一個作用域(一級緩存Session/二級緩存Namespaces)的進行了 C/U/D 操作後,默認該作用域下所有 select 中的緩存將被clear。

D. mybatis的緩存有幾種

1、一級緩存

MyBatis默認開啟了一級緩存,一級緩存是在SqlSession 層面進行緩存的。即,同一個SqlSession ,多次調用同一個Mapper和同一個方法的同一個參數,只會進行一次資料庫查詢,然後把數據緩存到緩沖中,以後直接先從緩存中取出數據,不會直接去查資料庫。

但是不同的SqlSession對象,因為不用的SqlSession都是相互隔離的,所以相同的Mapper、參數和方法,他還是會再次發送到SQL到資料庫去執行,返回結果。

2、二級緩存

為了克服這個問題,需要開啟二級緩存,是的緩存zaiSqlSessionFactory層面給各個SqlSession 對象共享。默認二級緩存是不開啟的,需要手動進行配置。

<cache/>

如果這樣配置的話,很多其他的配置就會被默認進行,如:

  • 映射文件所有的select 語句會被緩存

  • 映射文件的所有的insert、update和delete語句會刷新緩存

  • 緩存會使用默認的Least Recently Used(LRU,最近最少使用原則)的演算法來回收緩存空間

  • 根據時間表,比如No Flush Interval,(CNFI,沒有刷新間隔),緩存不會以任何時間順序來刷新

  • 緩存會存儲列表集合或對象(無論查詢方法返回什麼)的1024個引用

  • 緩存會被視為是read/write(可讀/可寫)的緩存,意味著對象檢索不是共享的,而且可以很安全的被調用者修改,不幹擾其他調用者或縣城所作的潛在修改

  • 可以在開啟二級緩存時候,手動配置一些屬性

  • <cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>

  • 各個屬性意義如下:

  • eviction:緩存回收策略
    - LRU:最少使用原則,移除最長時間不使用的對象
    - FIFO:先進先出原則,按照對象進入緩存順序進行回收
    - SOFT:軟引用,移除基於垃圾回收器狀態和軟引用規則的對象
    - WEAK:弱引用,更積極的移除移除基於垃圾回收器狀態和弱引用規則的對象

  • flushInterval:刷新時間間隔,單位為毫秒,這里配置的100毫秒。如果不配置,那麼只有在進行資料庫修改操作才會被動刷新緩存區

  • size:引用額數目,代表緩存最多可以存儲的對象個數

  • readOnly:是否只讀,如果為true,則所有相同的sql語句返回的是同一個對象(有助於提高性能,但並發操作同一條數據時,可能不安全),如果設置為false,則相同的sql,後面訪問的是cache的clone副本。

  • 可以在Mapper的具體方法下設置對二級緩存的訪問意願:

  • useCache配置

    如果一條語句每次都需要最新的數據,就意味著每次都需要從資料庫中查詢數據,可以把這個屬性設置為false,如:

  • <select id="selectAll" resultMap="BaseResultMap" useCache="false">

  • 刷新緩存(就是清空緩存)

    二級緩存默認會在insert、update、delete操作後刷新緩存,可以手動配置不更新緩存,如下:

  • <update id="updateById" parameterType="User" flushCache="false" />


  • 3、自定義緩存

    自定義緩存對象,該對象必須實現 org.apache.ibatis.cache.Cache 介面

每次查詢資料庫前,MyBatis都會先在緩存中查找是否有該緩存對象。只有當調用了commit() 方法,MyBatis才會往緩存中寫入數據,數據記錄的鍵為數字編號+Mapper名+方法名+SQL語句+參數格式,值為返回的對象值。

E. MyBatis二級緩存帶來的問題

MyBatis二級緩存使用的在某些場景下會出問題,來看一下為什麼這么說。

假設我有一條select語句(開啟了二級緩存):

selecta.col1, a.col2, a.col3, b.col1, b.col2, b.col3fromtableA a, tableB bwherea.id= b.id;

對於tableA與tableB的操作定義在兩個Mapper中,分別叫做MapperA與MapperB,即它們屬於兩個命名空間,如果此時啟用緩存:

MapperA中執行上述sql語句查詢這6個欄位

tableB更新了col1與col2兩個欄位

MapperA再次執行上述sql語句查詢這6個欄位(前提是沒有執行過任何insert、delete、update操作)

此時問題就來了,即使第(2)步tableB更新了col1與col2兩個欄位,第(3)步MapperA走二級緩存查詢到的這6個欄位依然是原來的這6個欄位的值,因為我們從CacheKey的3組條件來看:

<select>標簽所在的Mapper的Namespace+<select>標簽的id屬性

RowBounds的offset和limit屬性,RowBounds是MyBatis用於處理分頁的一個類,offset默認為0,limit默認為Integer.MAX_VALUE

<select>標簽中定義的sql語句

對於MapperA來說,其中的任何一個條件都沒有變化,自然會將原結果返回。

這個問題對於MyBatis的二級緩存來說是一個無解的問題,因此使用MyBatis二級緩存有一個前提: 必須保證所有的增刪改查都在同一個命名空間下才行 。

F. mybatis的cache-ref怎麼使用

首先明確一點 cache-ref 只對二級緩存有效,沒有使用二級緩存時,這東西沒有意義。
以下說明只針對二級緩存。
當mybatis的當前命名空間存在DML的事務提交時,會使當前命名空間里的緩存失效,這樣在查詢時,會直接從資料庫拿到數據,並再次緩存。但是如果是多表連接查詢,如tableA join tableB,A表的DML操作在A的nameSpace,B表的DML操作在B的nameSpace,當B表在進行了數據修改時,不會使A表緩存失效,再使用tableA join tableB會直接從緩存中獲取數據,因為此時緩存沒有刷新,而且B表的數據也有變化,那麼此時讀取的就是臟數據。
此時就需要在B的nameSpace里使用<cache-ref namespace="A"/>,保證跟新B時,A的緩存也失效。再在A裡面執行 tableA join tableB時,會重新從資料庫里查詢最新數據。

G. mybatis一級緩存內存佔用過大的問題

內存佔用過大可以通過flushCache="true"或者where <隨機數>=<隨機數>去除MyBatis的一級緩存來解決。

1、一級緩存是SqlSession級別的緩存 —— 它是各自獨立的。

在操作資料庫時需要構造sqlSession對象,在對象中有一個數據結構(HashMap)用於存儲緩存數據。

不同的sqlSession之間的緩存數據區域(HashMap)是互相不影響的。

2、二級緩存是mapper級別的緩存 —— 它是多個 SqlSession 共享的。

多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。

H. mybatis自帶一級和二級緩存,為什麼還要用redis

二級緩存是namespace區域內的,所以不同的namespace下操作同一張表,會導致數據不一致,個人從未使用過二級緩存,redis更靈活,功能更豐富

熱點內容
銅鏡資料庫 發布:2025-01-17 01:08:57 瀏覽:673
上傳圖片鏈接 發布:2025-01-17 01:08:11 瀏覽:891
智跑買車可以提哪些配置 發布:2025-01-17 01:06:46 瀏覽:463
qq2013源碼 發布:2025-01-17 01:06:35 瀏覽:94
sql的decode 發布:2025-01-17 01:01:01 瀏覽:4
系數參數配置什麼意思 發布:2025-01-17 00:34:03 瀏覽:755
台灣免費伺服器雲主機 發布:2025-01-17 00:29:07 瀏覽:870
c語言sizeofchar 發布:2025-01-17 00:29:01 瀏覽:469
安卓手機的雲備份在哪裡能找到 發布:2025-01-17 00:14:12 瀏覽:472
詐騙的腳本 發布:2025-01-16 23:51:27 瀏覽:315