今天寫**的時候碰到了乙個情況 簡單的的寫了乙個小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...