資深架構師帶你聊一聊:Mybaits緩存機制

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>

EmployeeMapper.xml 這樣就可以開啓我們的二級緩存了,但是這使用至少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緩存即可 我們可以創建ehcache.xml配置文件也可以直接配置 二級緩存屬性 ![](http://i2.51cto.com/images/blog/201810/15/afde74a140fcc3657bad818023011177.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 和緩存相關的設置 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,一級緩存會被禁用掉。 加Java架構師進階交流羣獲取Java工程化、高性能及分佈式、高性能、深入淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限 都是大牛帶飛 讓你少走很多的彎路的 羣號是:338549832 對了 小白勿進 最好是有開發經驗 注:加羣要求 1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。 2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。 3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。 4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。 5.阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶着大家全面、科學地建立自己的技術體系和技術認知!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章