Mybait緩存機制


MyBatis同大多數ORM框架一樣,提供了一級緩存和二級緩存的支持。

一級緩存:其作用域為session范圍內,當session執行flush或close方法后,一級緩存會被清空。

二級緩存:二級緩存和一級緩存機制相同,但是可以自定義其作用范圍,如Ehcache。

一級緩存

在默認情況下mybatis中的一級緩存是開啟的,一級緩存只在同一個SqlSession中有效不可以跨SqlSession。

@Test
public void testcache(){
        /**
         * 測試一級緩存
         */
        SqlSession session1 = sqlSessionFactory.openSession();
        EmployeeMapper employeeMapper = session1.getMapper(EmployeeMapper.class);
        List<Employee>  list1 = employeeMapper.findAll(null);
        System.out.println(list1);
        List<Employee>  list2 = employeeMapper.findAll(null);//不發送語句
        System.out.println(list2);
}

SqlSession調用clearCache()清除緩存,或者在執行增刪改操作后,SqlSession調用close(),commit()都會清理緩存。

二級緩存

MyBatis中使用二級緩存也非常簡單,首先開啟全局二級緩存配置信息,通過開啟cacheEnabled,然后在對應的mapper映射文件中使用<cache />標簽開啟二級緩存即可。

1.select 語句獲取出來的對象都會被緩存。

2.二級緩存所有實體類必須實現Serializable接口。

3.所有執行 insert,update 和 delete 語句后,緩存都會被刷新。
4.必須關閉session后才會寫入二級緩存中。

5.二級緩存的作用域是全局的,作用范圍是映射文件級別的。只在同一類型mapper映射對象中有效。

6.查詢數據時,會先查詢二級緩存,再查詢一級緩存,然后再查詢數據庫。

我們需要使用二級緩存必須在mybatis主配置文件中設置cacheEnabled設置為true,並且在實體類Mapper中啟用緩存。

<settings>
        <!-- 開啟駝峰式命名規則 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!-- 開啟二級緩存 -->
        <setting name="cacheEnabled" value="true"/>
 </settings>

EmployeeMapper.xml

<!-- 使用mybatis默認二級緩存 -->
 <cache/>

這樣就可以開啟我們的二級緩存了,但是這使用至少mybatis默認的二級緩存,mybatis緩存做的並怎么的好,所有我們需要整合第三方緩存機制。

EhCache 是一個純Java的進程內緩存框架,是一種廣泛使用的開源Java分布式緩存,具有快速、精干等特點,是Hibernate中默認的二級緩存。所以我們來整合Ehcache

導入:mybatis-ehcache-1.0.3.jar ,ehcache-core-2.6.8.jar,slf4j-api-1.7.25.jar ,slf4j-log4j12-1.7.25.jar

這個時候我們只需要在實體類指定只用EhCache緩存即可

<!-- 使用第三方緩存 -->
<cache type="org.mybatis.caches.ehcache.EhcacheCache" />

我們可以創建ehcache.xml配置文件也可以直接配置

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    <property name="timeToIdleSeconds" value="3600"/><!--1 hour-->
    <property name="timeToLiveSeconds" value="3600"/><!--1 hour-->
    <property name="maxEntriesLocalHeap" value="1000"/>
    <property name="maxEntriesLocalDisk" value="10000000"/>
    <property name="memoryStoreEvictionPolicy" value="LRU"/>
  </cache>

二級緩存屬性

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

和緩存相關的設置

1.核心配置文件中的cacheEnabled=true|false,開啟或關閉緩存(默認為true),只對二級緩存有效,對一級緩存無效。
2.在select標簽中有一個屬性useCache=true|false,開啟當前查詢標簽的緩存(默認為true),也是只對二級緩存有效,對一級緩存無效。
3.在每個增刪改標簽中都有一個flushCache=true|false屬性,設置是否清除緩存(默認為true)。一級和二級緩存都會被清空。
4.在查詢中也有flushCache=true|false 屬性(默認為false),如果設置為true,則每次查詢之后都會清除緩存。
5.sqlsession.clearCache()方法,清除緩存。只能清除一級緩存,對二級緩存無效。
6.全局配置文件中的localCacheScope屬性,表示本地緩存作用域(一級緩存)。取值為session|statement。默認為session。如果設置為statement,一級緩存會被禁用掉。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM