在實際專案中,有些情況下相同的查詢語句可能被重複執行,mybatis 提供了一級快取來優化這種情況,相同的查詢 sql 會命中一級快取,直接返回,減少不必要的資料庫查詢提高效能。
上面提到了資料庫 crud 操作最終都對映到了executor#query
和executor#update
方法上,當資料庫資料有更新時快取需要更新,cud 操作都由executor#update
方法進行處理,可以看到該方法中呼叫了clearlocalcache()
,這個方法將清空 perpetualcache 中的 hashmap(map#clear
)。
配置檔案提供了如下的屬性用來配置一級快取:
localcachescope 有兩種可選 value:
session
預設為 session 級別,即在乙個 mybatis 會話中執行的所有語句都將共享乙個localcache
。
session 級別會存在髒讀問題:當有多個 sqlsession ,比如有 a 和 b 兩個 session,當 a 和 b 都對相同 sql 進行了查詢(有了快取),假設 a session 更新了資料,那麼 a session 的快取會更新,但 b session 的快取不會更新,b 再執行相同的查詢就會讀到 b 的快取中的髒資料。
statement
只對當前執行的這乙個 statement 有效。
在queryfromdatabase
方法中會從資料庫查詢資料,並將資料放入快取,如果為 statement 範圍,那麼 167 行就會清空快取。
mybatis一級快取
autowired private sqlsessionfactory sqlsessionfactory autowired test transactional public void test selectall.size log.info 第2次查詢 selectall2.size 同乙個s...
MyBatis 一級快取
本地快取作用域預設為該sqlsession。當session flush或 close後,該session中的所有cache將清空。同一次會話期間,只要查詢過的資料都會儲存在當前sqlsession的乙個map中 key hashcode 查詢sql的id 編寫的sql語句 引數 1.不同的sqls...
mybatis一級快取
mybatis一級快取在沒有使用事務後,本地看不到效果,查詢時還是查詢了兩次資料庫。如下圖所示 開啟事務,在同乙個方法 同乙個回話,一級快取才有效果 transactional public refund getrefundtest long brefundid 加上事務後效果如下 一級快取什麼時候...