Mybatis在沒有配置的狀況下默認開啓一級緩存,一級緩存指相對於同一個sqlsession而言,sqlsession使用map存儲對象,map存儲了sql查詢的結果集,在操做數據庫時須要構建sqlsession對象,在對象中有一個數據結構用於存儲緩存數據,不一樣的sqlsession之間相互不影響。java
一級緩存的生命週期sql
MyBatis在開啓一個數據庫會話時,會 建立一個新的SqlSession對象,SqlSession對象中會有一個新的Executor對象。Executor對象中持有一個新的PerpetualCache對象;當會話結束時,SqlSession對象及其內部的Executor對象還有PerpetualCache對象也一併釋放掉。數據庫
若是SqlSession調用了close()方法,會釋放掉一級緩存PerpetualCache對象,一級緩存將不可用。緩存
若是SqlSession調用了clearCache(),會清空PerpetualCache對象中的數據,可是該對象仍可以使用。session
SqlSession中執行了任何一個update操做(update()、delete()、insert()) ,都會清空PerpetualCache對象的數據,可是該對象能夠繼續使用數據結構
一級緩存工做原理mybatis
用戶經過sql及參數查看緩存中是否有此數據,沒有則查詢數據庫,將查詢到的結果存儲到sqlsession中對應的一級緩存區域app
若是有update(),insert(),delete()操做,會執行commit操做,清空一級緩存中數據spa
若查詢參數和sql相同的狀況下,直接從緩存中讀取。對象
二級緩存是針對每一個mapper相同 的namespace進行緩存。每一個sqlsession都需調用mapper下的sql語句,在mapper級別設置了二級緩存的數據結構map,每一個mapper對應一個map數據結構,map中存儲了二級緩存的數據,存儲了sql執行查詢的結果集(java對象)。
UserMapper有一個二級緩存區域(按namespace分),其它mapper也有本身的二級緩存區域(按namespace分)。每個namespace的mapper都有一個二級緩存區域,兩個mapper的namespace若是相同,這兩個mapper執行sql查詢到數據將存在相同的二級緩存區域中。
工做原理
不一樣的sqlsession都要調用mapper下的sql語句發起數據庫請求。
sqlsession1執行UserMapper下的查詢用戶請求先從二級緩存中查找有沒有數據,若是沒有就從數據庫中查詢,而且將查詢到數據存儲二級緩存中。
sqlsession2執行UserMapper下的同一個查詢用戶請求,先從二級緩存中查找有沒有數據,若是有就從二級緩存中查詢數據,返回。
若是有一個sqlsession3執行UserMapper下添加、修改、刪除語句,執行commit操做後,將UserMapper下的全部緩存數據所有清空。