1. 程式人生 > >Mybait快取機制(四)

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,一級快取會被禁用掉。