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