MyBatis理解與掌握(緩存)

MyBatis理解與掌握(緩存)

@(MyBatis)[Java, 框架, MyBatis]java

一級緩存(SqlSession)

默認就能夠使用sql

框架處理緩存是 依賴sql映射id ,Mybatis的內部緩存使用一個HashMap,key爲hashcode+statementId+sql語句。Value爲查詢出來的結果集映射成的java對象。數據庫

一級緩存的做用域是一個SqlSession ,一旦session發生變化,一級緩存失敗緩存

在同一個SqlSession中,執行相同的查詢SQL,第一次會去查詢數據庫,並寫到緩存中;第二次直接從緩存中取。當執行SQL時兩次查詢中間發生了增刪改操做,則SqlSession的緩存清空。session

clipboard.png

每次查詢會先去緩存中找,若是找不到,再去數據庫查詢,而後把結果寫到緩存中。mybatis

二級緩存(SqlSessionFactory)

默認沒法使用app

若是想要使用,須要進行配置, 在映射文件中增長標籤<cache></cache>框架

要求緩存類必須實現可序列化接口spa

clipboard.png

二級緩存是mapper級別的。Mybatis默認是沒有開啓二級緩存。code

第一次調用mapper下的SQL去查詢用戶信息。查詢到的信息會存到該mapper對應的二級緩存區域內。

第二次調用 相同namespace下的mapper映射文件中相同的SQL 去查詢用戶信息。會去對應的二級緩存內取結果。

若是調用相同namespace下的mapper映射文件中的增刪改SQL,並執行了commit操做。此時會清空該namespace下的二級緩存。

使用二級緩存

(1)主配置文件mybatis-config.xml中作以下配置:

<settings>
    <setting name="lazyLoadingEnabled" value="true" />
    <setting name="aggressiveLazyLoading" value="false" />
    <setting name="cacheEnabled" value="true"/>
</settings>

2)在映射文件中,加入如下內容,開啓二級緩存:

<cache eviction="" flushInterval="" readOnly="true" size=""/>
  • eviction:移除策略。
  • LRU:最近最少使用的對象會被移除。
  • FIFO:First In First Out
  • flushInterval:緩存刷新時間(毫秒)
  • readOnly:只讀。二級緩存中一旦修改了數據,別人取到的緩存數據就不許確了,因此要設置爲readonly
  • size:1024(個)

(3)緩存類實現序列化
因爲二級緩存的數據不必定都是存儲到內存中,它的存儲介質多種多樣,因此須要給緩存的對象執行序列化。
若是該類存在父類,那麼父類也要實現序列化。

禁用二級緩存

該statement中設置userCache=false能夠禁用當前select語句的二級緩存,即每次查詢都是去數據庫中查詢,默認狀況下是true。

<select id="" parameterType="" resultType="" useCache="false">
    ....
</select>

刷新二級緩存

<select id="" parameterType="" resultType="" useCache="false" flushCache="true">
    ....
</select>
相關文章
相關標籤/搜索