1. 程式人生 > >mybatis+spring環境下快取的使用和mybatis一級快取失效原因

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

這些天由於專案存在資料訪問的效能問題,研究了下快取在各個階段的應用,一般來說,可以在5個方面進行快取的設計:

1.最底層可以配置的是MySQL自帶的query cache,

2.mybatis的一級快取,預設情況下都處於開啟狀態,只能使用自帶的PerpetualCache,無法配置第三方快取

3.mybatis的二級快取,可以配置開關狀態,預設使用自帶的PerpetualCache,但功能比較弱,能夠配置第三方快取,

4.service層的快取配置,結合spring,可以靈活進行選擇

5.針對實際業務情況,直接快取部分html頁面,直接返回給客戶端。

在測試過程中,發現mybatis的一級快取沒有起作用,失效了。經過調研,發現是由於以下原因引起的:

1.mybatis的一級快取生效的範圍是sqlsession,是為了在sqlsession沒有關閉時,業務需要重複查詢相同資料使用的。一旦sqlsession關閉,則由這個sqlsession快取的資料將會被清空。

2.spring對mybatis的sqlsession的使用是由template控制的,sqlsession又被spring當作resource放在當前執行緒的上下文裡(threadlocal),spring通過mybatis呼叫資料庫的過程如下:

           a,我們需要訪問資料

           b,spring檢查到了這種需求,於是去申請一個mybatis的sqlsession(資源池),並將申請到的sqlsession與當前執行緒繫結,放入threadlocal裡面

           c,template從threadlocal獲取到sqlsession,去執行查詢

           d,查詢結束,清空threadlocal中與當前執行緒繫結的sqlsession,釋放資源

           e,我們又需要訪問資料

           f,返回到步驟b

通過以上步驟後發現,同一執行緒裡面兩次查詢同一資料所使用的sqlsession是不相同的,所以,給人的印象就是結合spring後,mybatis的一級快取失效了。