最近發現一段代碼裏相同的2句查詢sql,第一次經過數據庫查詢出來,第二次卻沒有走數據庫直接獲得結果,那麼他天然是拿的緩存裏的數據,因而去研究了一下mybatis的緩存機制.
mybatis緩存分爲一級緩存和二級緩存
一級緩存是做用於sqlsession的,緩存的數據在同一個sqlsession內生效.
二級緩存是做用於mapper的,緩存的數據在同一個namespace內生效.spring
操做數據庫前咱們會先建立sqlsession對象,當同一個sqlsession查詢2次相同的sql語句,第一次查詢後會將查詢到的數據寫入緩存中,第二次再查詢會直接拿緩存中的數據,不會再操做數據庫,直到sqlsession執行了insert,update,delete操做並提交到數據庫纔會清空緩存,一級緩存是默認開啓的.sql
二級緩存做用在mapper的同一個namespace,不一樣的sqlsession兩次執行相同的namespace下的 sql語句,第一次會將查詢到的數據寫入緩存中,第二次再查詢會直接拿緩存中的數據,二級緩存是默認關閉的.數據庫
明顯以前的2次查詢是不一樣的sqlsession,二級緩存又沒有開啓,那第二次查詢又爲什麼直接拿了緩存中的數據,通過一段時間的上網搜索,發現和我那段代碼加了事務有關,mybatis在和spring集成後,會自動將session綁定到事務上,因此2次查詢第二次會拿緩存中的結果.緩存
在mapper配置文件中,給select加上flushCache="true",這樣會清空緩存第二次會再去數據庫查詢.session