本文主要講mybatis的一級緩存,一級緩存是SqlSession級別的緩存。
查詢緩存
mybatis提供查詢緩存,用于減輕數(shù)據(jù)壓力,提高數(shù)據(jù)庫性能。
mybaits提供一級緩存,和二級緩存。
一級緩存是SqlSession級別的緩存。在操作數(shù)據(jù)庫時需要構(gòu)造sqlSession對象,在對象中有一個數(shù)據(jù)結(jié)構(gòu)(HashMap)用于存儲緩存數(shù)據(jù)。不同的sqlSession之間的緩存數(shù)據(jù)區(qū)域(HashMap)是互相不影響的。
二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。
為什么要用緩存?
如果緩存中有數(shù)據(jù)就不用從數(shù)據(jù)庫中獲取,大大提高系統(tǒng)性能。
一級緩存
一級緩存工作原理
第一次發(fā)起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,如果沒有,從數(shù)據(jù)庫查詢用戶信息。得到用戶信息,將用戶信息存儲到一級緩存中。
如果sqlSession去執(zhí)行commit操作(執(zhí)行插入、更新、刪除),清空SqlSession中的一級緩存,這樣做的目的為了讓緩存中存儲的是最新的信息,避免臟讀。
第二次發(fā)起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,緩存中有,直接從緩存中獲取用戶信息。
一級緩存測試
mybatis默認支持一級緩存,不需要在配置文件去配置。
按照上邊一級緩存原理步驟去測試。
測試代碼
// 一級緩存測試
@Test
public void testCache1() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();// 創(chuàng)建代理對象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 下邊查詢使用一個SqlSession
// 第一次發(fā)起請求,查詢id為1的用戶
User user1 = userMapper.findUserById(1);
System.out.println(user1);
// 如果sqlSession去執(zhí)行commit操作(執(zhí)行插入、更新、刪除),清空SqlSession中的一級緩存,這樣做的目的為了讓緩存中存儲的是最新的信息,避免臟讀。
// 更新user1的信息
// user1.setUsername(“測試用戶22”);
// userMapper.updateUser(user1);
// //執(zhí)行commit操作去清空緩存
// sqlSession.commit();
// 第二次發(fā)起請求,查詢id為1的用戶
User user2 = userMapper.findUserById(1);
System.out.println(user2);
sqlSession.close();
}
1.不執(zhí)行更新操作,輸出:
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.
一級緩存應(yīng)用
正式開發(fā),是將mybatis和spring進行整合開發(fā),事務(wù)控制在service中。
一個service方法中包括 很多mapper方法調(diào)用。
service{
//開始執(zhí)行時,開啟事務(wù),創(chuàng)建SqlSession對象
//第一次調(diào)用mapper的方法findUserById(1)
//第二次調(diào)用mapper的方法findUserById(1),從一級緩存中取數(shù)據(jù)
//方法結(jié)束,sqlSession關(guān)閉
}
如果是執(zhí)行兩次service調(diào)用查詢相同的用戶信息,不走一級緩存,因為session方法結(jié)束,sqlSession就關(guān)閉,一級緩存就清空。
評論
查看更多