mybatis學習筆記(14)-查詢緩存之一級緩存

mybatis學習筆記(14)-查詢緩存之一級緩存

標籤: mybatisjava


[TOC]mysql


本文主要講mybatis的一級緩存,一級緩存是SqlSession級別的緩存。git

查詢緩存

mybatis提供查詢緩存,用於減輕數據壓力,提升數據庫性能。github

mybaits提供一級緩存,和二級緩存。spring

查詢緩存

一級緩存是SqlSession級別的緩存。在操做數據庫時須要構造sqlSession對象,在對象中有一個數據結構(HashMap)用於存儲緩存數據。不一樣的sqlSession之間的緩存數據區域(HashMap)是互相不影響的。sql

二級緩存是mapper級別的緩存,多個SqlSession去操做同一個Mapper的sql語句,多個SqlSession能夠共用二級緩存,二級緩存是跨SqlSession的。數據庫

爲何要用緩存?緩存

若是緩存中有數據就不用從數據庫中獲取,大大提升系統性能。session

一級緩存

一級緩存工做原理

一級緩存工做原理

第一次發起查詢用戶id爲1的用戶信息,先去找緩存中是否有id爲1的用戶信息,若是沒有,從數據庫查詢用戶信息。獲得用戶信息,將用戶信息存儲到一級緩存中。數據結構

若是sqlSession去執行commit操做(執行插入、更新、刪除),清空SqlSession中的一級緩存,這樣作的目的爲了讓緩存中存儲的是最新的信息,避免髒讀。

第二次發起查詢用戶id爲1的用戶信息,先去找緩存中是否有id爲1的用戶信息,緩存中有,直接從緩存中獲取用戶信息。

一級緩存測試

mybatis默認支持一級緩存,不須要在配置文件去配置。

按照上邊一級緩存原理步驟去測試。

測試代碼

// 一級緩存測試
@Test
public void testCache1() throws Exception {
	SqlSession sqlSession = sqlSessionFactory.openSession();// 建立代理對象
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

	// 下邊查詢使用一個SqlSession
	// 第一次發起請求,查詢id爲1的用戶
	User user1 = userMapper.findUserById(1);
	System.out.println(user1);

	// 若是sqlSession去執行commit操做(執行插入、更新、刪除),清空SqlSession中的一級緩存,這樣作的目的爲了讓緩存中存儲的是最新的信息,避免髒讀。

	// 更新user1的信息
	// user1.setUsername("測試用戶22");
	// userMapper.updateUser(user1);
	// //執行commit操做去清空緩存
	// sqlSession.commit();

	// 第二次發起請求,查詢id爲1的用戶
	User user2 = userMapper.findUserById(1);
	System.out.println(user2);

	sqlSession.close();

}

1.不執行更新操做,輸出:

DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 110771485.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@69a3d1d]
DEBUG [main] - ==>  Preparing: SELECT * FROM user WHERE id=? 
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1
User [id=1, username=王五, sex=2, birthday=null, address=null]
User [id=1, username=王五, sex=2, birthday=null, address=null]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@69a3d1d]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@69a3d1d]
DEBUG [main] - Returned connection 110771485 to pool.

2.取消測試代碼中更新的的註釋,輸出:

DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 110771485.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@69a3d1d]
DEBUG [main] - ==>  Preparing: SELECT * FROM user WHERE id=? 
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1
User [id=1, username=王五, sex=2, birthday=null, address=null]
DEBUG [main] - ==>  Preparing: update user set username=?,birthday=?,sex=?,address=? where id=? 
DEBUG [main] - ==> Parameters: 測試用戶22(String), null, 2(String), null, 1(Integer)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@69a3d1d]
DEBUG [main] - ==>  Preparing: SELECT * FROM user WHERE id=? 
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1
User [id=1, username=測試用戶22, sex=2, birthday=null, address=null]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@69a3d1d]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@69a3d1d]
DEBUG [main] - Returned connection 110771485 to pool.

一級緩存應用

正式開發,是將mybatis和spring進行整合開發,事務控制在service中。

一個service方法中包括 不少mapper方法調用。

service{
	//開始執行時,開啓事務,建立SqlSession對象
	//第一次調用mapper的方法findUserById(1)
	
	//第二次調用mapper的方法findUserById(1),從一級緩存中取數據
	//方法結束,sqlSession關閉
}

若是是執行兩次service調用查詢相同的用戶信息,不走一級緩存,由於session方法結束,sqlSession就關閉,一級緩存就清空。


做者@brianway更多文章:我的網站 | CSDN | oschina

相關文章
相關標籤/搜索