1. 程式人生 > 其它 >Mybatis入門(十一) mybati快取簡介

Mybatis入門(十一) mybati快取簡介

什麼是快取?

快取是指存在記憶體中的資料,將使用者經常查詢的資料放在快取(記憶體)中,使用者去查詢資料就不用從磁碟上查詢,而是走快取

為什麼要用快取?

每次查詢都要連線資料庫十分耗資源,快取可以減少和資料庫的互動次數,減少開銷,提高效率,解決了高併發系統的效能問題

什麼樣的資料可以進行快取?

經常查詢且不經常改變的資料

MyBatis快取

mybatis內建了一個非常強大的快取特性,其中包含一級快取和二級快取

一級快取:

一級快取mybatis預設開啟,無法關閉,是一次會話(sqlsession)的快取,又稱本地快取。

同一次會話中查詢的資料會保留到快取,當再次獲取同樣的資料時,直接從快取中獲取,而不走資料庫,debug測試如下:

圖1表示一次會話中進行兩次相同的查詢,圖二為debug除錯檢視,第二次直接走快取

二級快取

二級快取也叫全域性快取,一級快取作用域太低了,所以誕生了二級快取
基於namespace級別的快取,也就是一個mapper檔案,一個名稱空間,對應一個二級快取

工作機制

  • 一個會話查詢一條資料,這個資料就會被放在當前會話的一級快取中
  • 如果會話關閉了,這個會員對應的一級快取就沒了;但是我們想要的是,會話關閉了,一級快取中的資料被儲存到二級快取中
  • 新的會話查詢資訊,就可以從二級快取中獲取內容
  • 不同的mapper查詢出的資料會放在自己對應的快取(map)中

二級快取需要手動設定,首先在核心配置檔案中,有個setting屬性(cacheEnabled)配置是否開啟二級快取,預設是開啟的,也可以自己在顯示的開啟,如下圖

當一級快取,也就是sqlsession關閉時,才會進行二級快取的儲存,由於是作用在namespace上,所以需要在mapper檔案上顯性開啟,如下圖

//在當前Mapper.xml中使用二級快取-
<cache
       eviction="FIFO"
       flushInterval="60000"
       size="512"
       readOnly="true"/>


//或者可以直接
<cacsh/>

快取失效的情況:

1.查詢不同的東西

2.增刪改操作,可能會改變原來的資料,所以必定會重新整理快取

3.查詢不同的Mapper.xml

4.手動清理快取

小結:

  • 只要開啟了二級快取,在同一個Mapper下就有效
  • 所有的資料都會放在一級快取中
  • 只有當前會話提交,或者關閉的時候,才會提交到二級快取中
  • 只有查詢才有快取,根據資料是否需要快取(修改是否頻繁選擇是否開啟)useCache=“true”
   //一個查詢語句可以指定是否開啟 
  <select id="selectBlog" parameterType="map" resultType="blog" useCache="true"> select * from bloghys <where> <if test="title !=null"> and title like concat('%',#{title},'%') </if> </where>

關於自定義快取Ehcache ,他是一種廣泛使用的開源Java分散式快取。主要面向通用快取

需要打包,並且在核心配置檔案中指定這個包:

<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.2.1</version>
</dependency>



<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>