MyBatis 快取 上 一級快取

2021-09-01 08:17:19 字數 991 閱讀 4899

在實際專案中,有些情況下相同的查詢語句可能被重複執行,mybatis 提供了一級快取來優化這種情況,相同的查詢 sql 會命中一級快取,直接返回,減少不必要的資料庫查詢提高效能。

上面提到了資料庫 crud 操作最終都對映到了executor#queryexecutor#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 加上事務後效果如下 一級快取什麼時候...