1. 程式人生 > >Mybatis一級快取導致分散式環境下的查詢髒資料

Mybatis一級快取導致分散式環境下的查詢髒資料

    Mybatis一級快取,也稱本地快取,預設是SqlSession級別的快取。在一次程式與資料庫的會話(Sqlsession)中,mybatis會維護一個以hashmap為儲存結構的一級快取,在這個會話中,只要在兩次相同條件的查詢中間,這個會話裡沒有出現增刪改的操作,那麼Mybatis會在第二次查詢時候在快取中將這個結果返回,導致兩次查詢的返回結果物件其實是一個,用“==”比較結果為true。

    Mybatis的一級快取是預設開啟的,且截至目前我們無法關閉。當一級快取預設是SqlSession級別時,其生命週期和其所在的Sqlsession相同。而且,Mybatis的一級快取使用了hashMap,且沒有做容量上的限定。

    在分散式環境下,Mybatis的一級快取無法集中統一管理,也就是說Mybatis無法搭建分散式快取。在多個SqlSession環境下,雖然可以使用二級快取,即全域性快取,以在多個SqlSession共享快取,但是畢竟是本地儲存,還是無法適應分散式的需求。所以為了避免在分散式環境下的髒資料讀取,解決方法有兩個,一是可以設定Mybatis一級快取為STATEMENT級別,因為在查詢方法執行的最後,會判斷一級快取級別是否是STATEMENT級別,如果是的話,就清空快取。如此一來,便相當於不使用一級快取。在select標籤裡面設定flushCache="true"即可,也可以如圖2配置成全域性,但是後面這種方式在一些版本中並不支援。在自己建立SqlSession的時候,每次查詢完畢後呼叫SqlSession類的clearCache()方法也可以清空快取。

    二是使用EnChache等分散式快取框架,搭建分散式快取。 

Psby2018/7/26 10:17 : 作者親測,在Spring boot+Mybatis某些版本之後,就沒有這個問題了,可能是每次訪問Mapper都會建立新的SqlSession,當然只是可能。反正如果是Spring boot環境,可以在配置檔案中加入

logging.level.com.example.demo.test.dao.userMapper=debug

com.example.demo.test.dao.userMapper是你的dao介面名字。作者在這裡忘記大寫首字母了,見怪勿怪。。。

如果是Spring 環境,在mybatis-config檔案中的configuration根節點加入

<settings>
   <!-- 列印查詢語句 -->
   <setting name="logImpl" value="STDOUT_LOGGING" />
</settings>

,就可以在控制檯檢視程式是否執行了Sql語句了,從而判斷是否會出現髒資料讀取問題。

    關於MyBatis的好的文章:

相關推薦

Mybatis一級快取導致分散式環境查詢資料

    Mybatis一級快取,也稱本地快取,預設是SqlSession級別的快取。在一次程式與資料庫的會話(Sqlsession)中,mybatis會維護一個以hashmap為儲存結構的一級快取,在這個會話中,只要在兩次相同條件的查詢中間,這個會話裡沒有出現增刪改的操作,那

mybatis+spring環境快取的使用和mybatis一級快取失效原因

這些天由於專案存在資料訪問的效能問題,研究了下快取在各個階段的應用,一般來說,可以在5個方面進行快取的設計: 1.最底層可以配置的是MySQL自帶的query cache, 2.mybatis的一級快取,預設情況下都處於開啟狀態,只能使用自帶的PerpetualCac

MyBatis一級快取和二級快取詳解

一級快取   Mybatis對快取提供支援,但是在沒有配置的預設情況下,它只開啟一級快取,一級快取只是相對於同一個SqlSession而言。所以在引數和SQL完全一樣的情況下,我們使用同一個SqlSession物件呼叫一個Mapper方法,往往只執行一次SQL,因為使用SelSession第一次

分散式環境 session 的跨域共享原理

一、什麼是 session 共享 ? 如上圖,是一個簡單的分散式環境,以登入來說,當用戶發出請求,通過負載均衡,可能會走tomcat1伺服器,也可能會走tomcat2伺服器,此時就有可能,我們在tomcat1上實現了登入,儲存了session,但是tomcat2並沒有儲存,當有請求

Spring Cloud (四): 分散式環境自動發現配置服務

前一章, 我們的Hello world應用服務,通過配置伺服器Config Server獲取到了我們配置的hello資訊“hello world”. 但自己的配置檔案中必須配置config server的URL(http://localhost:8888), 如果把config server搬到另外一個獨立I

mybatis 一級快取和二級快取 配置使用

mybatis提供查詢快取,用於減輕資料壓力,提高資料庫效能。 mybaits提供一級快取,和二級快取。 1、一級快取 ​ MyBatis 預設開啟了一級快取,一級快取是在SqlSession 層面進行快取的。即,同一個SqlSession ,多次呼叫同一個Mapp

Java叢集/分散式環境5種session處理策略

前言 在搭建完叢集環境後,不得不考慮的一個問題就是使用者訪問產生的session如何處理。如果不做任何處理的話,使用者將出現頻繁登入的現象,比如叢集中存在A、B兩臺伺服器,使用者在第一次訪問網站時,Nginx通過其負載均衡機制將使用者請求轉發到A伺服器,這時A伺服器就會給使

巧用分散式環境的優雅技術,只有頭髮少的人才研究過(轉載備忘)

轉載自,向原作者致謝https://www.toutiao.com/a6633272364639470084/?iid=53593196063&app=news_article&group_id=6633272364639470084&timestamp=1544437809 什麼是

mybatis 第六篇 MyBatis一級快取和二級快取

一、一級快取 1.什麼是一級快取 每當我們使用mybatis開啟一次資料庫會話,mybaits就會建立一個sqlSession物件。 在一次資料庫會話中,當我們執行完全相同的sql語句,為了解決資源浪費

mybatis一級快取二級快取

一級快取   Mybatis對快取提供支援,但是在沒有配置的預設情況下,它只開啟一級快取,一級快取只是相對於同一個SqlSession而言。所以在引數和SQL完全一樣的情況下,我們使用同一個SqlSession物件呼叫一個Mapper方法,往往只執行一次SQL,因為使用SelSession第一次查詢後,My

【轉】【Linux運維-叢集技術進階】叢集/分散式環境5種session處理策略

前言 在搭建完叢集環境後,不得不考慮的一個問題就是使用者訪問產生的session如何處理。如果不做任何處理的話,使用者將出現頻繁登入的現象,比如叢集中存在A、B兩臺伺服器,使用者在第一次訪問網站時,Nginx通過其負載均衡機制將使用者請求轉發到A伺服器,這時A伺服器

Mybatis一級快取和二級快取理解

持久層框架:Mybatis Mybatis提供查詢快取分為一級快取和二級快取,用於減輕資料庫壓力,提高資料庫效能。 一級快取的工作原理 一級快取是SqlSession級別的快取   MyBatis的一級查詢快取是由 org.apache.ibatis.cache.

簡單訴說mybatis一級快取和二級快取

Mybatis提供快取分別為一級快取和二級快取,用於減輕資料庫壓力,提高資料庫效能。 一級快取是SqlSession級別的快取;二級快取是mapper級別(namespace)的快取 一級快取作用域是sqlsession,生命週期是sqlsession,預設開啟,不能關閉

MyBatis一級快取和二級快取

“花明月暗籠輕霧,今宵好向郎邊去” 前言 在實際專案開發中,通常對資料庫查詢的效能要求很高,而 Mybatis提供了查詢快取來快取資料,從而達到提高查詢效能的要求。 Mybatis的査詢快取分為一級快取和二級快取。一級快取是 SqlSession級別的快取,二級

Linux環境查詢檔案的安裝路徑

Linux中檢視某 個軟體的安裝路徑(地址)有時顯得非常重要。比如某個檔案的快速啟動項被刪除,或者你要建立快速啟動項,或者想刪除、 新增安裝檔案等等,很多地方都要用到查案檔案安裝路徑的命令。 這裡給大家介紹Linux檢視檔案安裝路徑(地址)命令。 一、檢視檔案安裝路徑

Mybatis二級快取分散式二級快取、逆向工程、Spring 整合 --day06

Mybatis二級快取、分散式二級快取、逆向工程、Spring 整合 --day06 一、什麼是二級快取   上一篇介紹了一級快取,一級快取是一個sqlSession使用一個快取區域。那麼二級快取呢?   思考,多個sqlSession,但是每個sqlSession都執行 通過id查

Mybatis 一級快取 菜鳥日記--day06

Mybatis 一級快取 菜鳥日記–day06 一、快取概述  針對查詢結果進行快取,能夠提高資料庫效能,減少對資料庫的訪問,降低資料庫效能消耗。  這裡講的快取就是講查詢到的結果放到記憶體中(只限於一級快取),當下次需要獲取這條資料的時候就可以直接從快取中獲取,而不是再次去訪問

單機環境分散式環境K-Means聚類演算法的執行例項

  單機環境下的K-Means聚類演算法執行例項 參考書籍《Mahout in Action》:要資源的可以找我~(中英文都有) 在eclipse平臺上實現K-Means例項 程式碼如下: package kmeans; import java.io.File; im

Java B2B2C多使用者商城 springboot架構 (四): 分散式環境自動發現配置服務

前一章, 我們的Hello world應用服務,通過配置伺服器Config Server獲取到了我們配置的hello資訊“hello world”. 但自己的配置檔案中必須配置config server的URL(http://localhost:8888), 如果把config server搬到另外一個獨立I

分散式環境用redis模擬session

首先為什麼使用redis? 因為分散式有不同伺服器的緣故,如果你安照一般方式儲存session,那麼你的session會儲存在某一臺伺服器上,如果你的下一個請求並不是訪問這臺伺服器,那麼會發生讀取不到session的情況 redis儲存的實現方案: 第一種