1. 程式人生 > 實用技巧 >mybatis快取機制

mybatis快取機制

像大多數的持久化框架一樣,Mybatis 也提供了快取策略,通過快取策略來減少資料庫的查詢次數,從而提
高效能。
Mybatis 中快取分為一級快取,二級快取。

Mybatis 一級快取

一級快取是 SqlSession 級別的快取,只要 SqlSession 沒有 flush 或 close,它就存在。
一級快取是 SqlSession 範圍的快取,當呼叫 SqlSession 的修改,新增,刪除,commit(),close()等方法時,就會清空一級快取。

第一次發起查詢使用者 id 為 1 的使用者資訊,先去找快取中是否有 id 為 1 的使用者資訊,如果沒有,從資料庫查
詢使用者資訊。
得到使用者資訊,將使用者資訊儲存到一級快取中。
如果 sqlSession 去執行 commit 操作(執行插入、更新、刪除),清空 SqlSession 中的一級快取,這樣
做的目的為了讓快取中儲存的是最新的資訊,避免髒讀。
第二次發起查詢使用者 id 為 1 的使用者資訊,先去找快取中是否有 id 為 1 的使用者資訊,快取中有,直接從快取
中獲取使用者資訊。

Mybatis 二級快取


首先開啟 mybatis 的二級快取。

sqlSession1 去查詢使用者資訊,查詢到使用者資訊會將查詢資料儲存到二級快取中
如果 SqlSession3 去執行相同 mapper 對映下 sql,執行 commit 提交,將會清空該 mapper 對映下的二
級快取區域的資料。
sqlSession2 去查詢與 sqlSession1 相同的使用者資訊,首先會去快取中找是否存在資料,如果存在直接從
快取中取出資料。

二級快取的開啟與關閉

第一步:在 SqlMapConfig.xml 檔案開啟二級快取

<settings>
<!-- 開啟二級快取的支援 --> <setting name="cacheEnabled" value="true"/>
</settings>
因為 cacheEnabled 的取值預設就為 true,所以這一步可以省略不配置。為 true 代表開啟二級快取;為
false 代表不開啟二級快取。

2 第二步:配置相關的 Mapper 對映檔案

<cache>標籤表示當前這個 mapper 對映將使用二級快取,區分的標準就看 mapper 的 namespace 值。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper 
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.itheima.dao.IUserDao">
<!-- 開啟二級快取的支援 -->
<cache></cache>
</mapper>

** 第三步:配置 statement 上面的 useCache 屬性**

<!-- 根據 id 查詢 --> <select id="findById" resultType="user" parameterType="int" useCache="true">
select * from user where id = #{uid}
</select> 將 UserDao.xml 對映檔案中的<select>標籤中設定 useCache=”true”代表當前這個 statement 要使用
二級快取,如果不使用二級快取可以設定為 false。
注意:針對每次查詢都需要最新的資料 sql,要設定成 useCache=false,禁用二級快取。

二級快取注意事項

**  當我們在使用二級快取時,所快取的類一定要實現 java.io.Serializable 介面,這種就可以使用序列化
方式來儲存物件。**
/**
* 
* <p>Title: User</p>
* <p>Description: 使用者的實體類</p>
* <p>Company: http://www.itheima.com/ </p>
*/
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address; }