面試官:蟲蟲你簡歷上寫了瞭解mybatis緩存,那你能說說一級緩存和二級緩存的區別嗎?面試
蟲蟲:我只知道這是用來緩存sql查詢的數據sql
面試官:沒了?數據庫
蟲蟲:沒了緩存
面試官:公司門知道在哪裏吧 本身走仍是我送你session
以上是蟲蟲的面試經歷 因而蟲蟲決定惡補一下Mybatis緩存機制的知識mybatis
Mybatis對緩存提供支持,一級緩存是默認使用的app
二級緩存須要手動開啓性能
區別:一級緩存的做用域是一個sqlsession內;二級緩存做用域是針對mapper進行緩存.
測試
在參數和SQL徹底同樣的狀況下,咱們使用同一個SqlSession對象調用一個Mapper方法,每每只執行一次SQL,由於使用SelSession第一次查詢後,MyBatis會將其放在緩存中,之後再查詢的時候,若是沒有聲明須要刷新,而且緩存沒有超時的狀況下,SqlSession都會取出當前緩存的數據,而不會再次發送SQL到數據庫。spa
一級緩存時執行commit,close,增刪改等操做,就會清空當前的一級緩存;當對SqlSession執行更新操做(update、delete、insert)後並執行commit時,不只清空其自身的一級緩存(執行更新操做的效果),也清空二級緩存(執行commit()的效果)。
二級緩存指的就是同一個namespace下的mapper,二級緩存中,也有一個map結構,這個區域就是一級緩存區域。一級緩存中的key是由sql語句、條件、statement等信息組成一個惟一值。一級緩存中的value,就是查詢出的結果對象。
一、在配置文件中 開啓二級緩存的總開關
<setting name="cacheEnabled" value="true" />
二、 在mapper映射文件中開啓二級緩存
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
參數名 | 屬性 |
---|---|
eviction | 收回策略 |
flushInterval | 刷新間隔 |
size | 引用數目 |
readOnly | 只讀 |
參數名 | 屬性 |
---|---|
eviction="LRU" | 最近最少使用的:移除最長時間不被使用的對象。 (默認) |
eviction="FIFO" | 先進先出:按對象進入緩存的順序來移除它們。 |
eviction="SOFT" | 軟引用:移除基於垃圾回收器狀態和軟引用規則的對象。 |
eviction="WEAK" | 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的對象。 |
三、實體類實現Serializable
如測試sql語句性能時緩存會影響測試準確性 須要禁用
在映射文件中:
默認值是true useCache=」false」
<select id="findAllPets" resultMap="petsMap" useCache="false"> select * from pets </select>
在映射文件中:
屬性:flushCache=」true」
刷新緩存,在查詢
語句中,默認值是false
,在新增刪除修改
語句中,默認值是true
(清空緩存)
要是能爲您提供幫助,請給予支持(關注、點贊
、分享),蟲蟲蟹蟹你們了!