一般來說,可以在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的一級緩存失效了。
原文地址:http://blog.csdn.net/jield/article/details/50163327