Mybatis快取的那些事

2021-08-21 23:39:14 字數 1335 閱讀 2621

今天寫**的時候碰到了乙個情況 簡單的的寫了乙個小demo

@test

@transactional

public void test()

private void change(integer roleid, string s)

對插入資料庫的一條資料做了乙個change操作,但是並沒有傳入rolebase這個物件。

輸出:

通過觀察輸出,可以看出通過 selectbyprimarykey 這個方法查出的物件是同乙個物件,而且rolebase的值被改變了。

第一反應就是用了快取。

之後通過修改mybatis的配置

不啟用快取,但是查出來的資料依然是一樣的,還是同乙個物件。

之後通過對selectbyprimarykey打斷點,跟蹤執行的流程

這裡將資料快取進了localcache!!!

mybatis提供了兩種cache型別:local cache和cache

cache,也就是所謂的二級快取。由以下引數控制:

要特別注意的是,mybatis的local cache是無法關閉的。

那麼local cache幹了什麼?在預設配置情況下,mybatis會將同一session內的查詢結果都放在local cache中,這樣可以提高效能,避免每次都hit到資料庫。

那麼cache幹了什麼呢?和local cache相對的,cache是跨session的,也就是說這個session中快取的結果,在另外乙個session中也能夠用到。

前面已經講到了在同一session中的查詢會將結果快取,那麼這個和我們一開始提到的問題有什麼關係呢?聰明的你一定已經想到了,這個問題和啟用了事務有關。

實際上mybatis在和spring整合後,會自動將session繫結到事務上,那麼就會產生前面提到的問題。

有以下幾種解決辦法:

在mybatis配置檔案中localcachescope=statement

不用事務

快取參考:

測試了1,3兩個方法可以結局localcache的問題。2應該也ok

學習可以學習美團點評對mybatis的快取介紹,講的很詳細了。

快取那些事

從看大公司的前端效能優化到自己專案實戰,快取是一件極其有意思的事情之一 還有正則,函式,再扯就跑題了。在此我們先把邏輯流程走一遍。etag 這是啥 請求head中的乙個屬性 幹啥的 幫助伺服器控制web端的快取驗證 怎麼幹的 當瀏覽器請求伺服器的某項資源 a 時,伺服器根據a算出乙個值hash 有人...

mybatis別名那些事

insert into users name,age values parametertype me.gacl.domain.user 這裡寫的實體類user的全類名me.gacl.domain.user,每次都寫這麼一長串內容挺麻煩的,而我們希望能夠簡寫成下面的形式 insert into use...

關於快取的那些事

cookie的缺陷是非常明顯的 1.資料大小 作為儲存容器,cookie的大小限制在4kb左右這是非常坑爹的,尤其對於現在複雜的業務邏輯需求,4kb的容量除了儲存一些配置欄位還簡單單值資訊,對於絕大部分開發者來說真的不知指望什麼了。2.安全性問題 由於在http請求中的cookie是明文傳遞的 ht...