柚子快報激活碼778899分享:MyBatis的緩存
目錄
1.緩存介紹
2.一級緩存
2.1.mapper
2.2.測試一級緩存
2.3.一級緩存的分析
2.4.測試清空一級緩存
3.二級緩存
3.1.pojo
3.2.開啟二級緩存
3.3.測試二級緩存
3.4.二級緩存分析
3.5.測試清空二級緩存
1.緩存介紹
為什么使用緩存? 首次訪問時,查詢數(shù)據(jù)庫,并將數(shù)據(jù)存儲到內(nèi)存中;再次訪問時直接訪問緩存,減少IO、硬盤讀寫次數(shù)、提高效率 Mybatis中的一級緩存和二級緩存?
一級緩存: 它指的是mybatis中的SqlSession對象的緩存。當(dāng)我們執(zhí)行完查詢之后,查詢的結(jié)果會同時存在在SqlSession為我們提供的一塊區(qū)域中。當(dāng)我們再次查詢同樣的數(shù)據(jù),mybatis會先去SqlSession中查詢是否有,有的話直接拿出來使用。當(dāng)SqlSession對象消失時,Mybatis的一級緩存也就消失了。 二級緩存: 它指的是Mybatis中SqlSessionFactory對象的緩存,由同一個SqlSessioFactory對象創(chuàng)建的SqlSession共享其緩存。
2.一級緩存
2.1.mapper
public interface UserDao {
//根據(jù)id查詢用戶信息
public User findUserById(Integer id);
}
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
select * from user where id=#{id}
2.2.測試一級緩存
@Test
public void testFindUserById() throws Exception{
SqlSession sqlSession1 = sqlSessionFactory.openSession();
UserDao userDao = sqlSession1.getMapper(UserDao.class);
User user1 = userDao.findUserById(41);//執(zhí)行查詢
System.out.println("第一次查詢:" + user1);
User user2 = userDao.findUserById(41);//不執(zhí)行查詢
System.out.println("第二次查詢:" + user2);
SqlSession sqlSession2 = sqlSessionFactory.openSession();
userDao = sqlSession2.getMapper(UserDao.class);
User user3 = userDao.findUserById(41);//執(zhí)行查詢
System.out.println("第三次查詢:" + user1);
}
2.3.一級緩存的分析
一級緩存是SqlSession范圍的緩存,當(dāng)調(diào)用SqlSession的commit(),close()等方法時,就會清空一級緩存。
第一次發(fā)起查詢用戶id為 1 的用戶信息,先去找緩存中是否有id為 1 的用戶信息,如果沒有,從數(shù)據(jù)庫查詢用戶信息。 得到用戶信息,將用戶信息存儲到一級緩存中。 如果sqlSession去執(zhí)行 commit操作(執(zhí)行插入、更新、刪除),清空 SqlSession 中的一級緩存,這樣做的目的為了讓緩存中存儲的是最新的信息,避免臟讀。 第二次發(fā)起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,緩存中有,直接從緩存中獲取用戶信息。
2.4.測試清空一級緩存
@Test
public void testFindUserById() throws Exception{
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user1 = userDao.findUserById(41);//執(zhí)行查詢
System.out.println("第一次查詢:" + user1);
User user2 = userDao.findUserById(41);//不執(zhí)行查詢
System.out.println("第二次查詢:" + user2);
sqlSession.commit();
User user3 = userDao.findUserById(41);//執(zhí)行查詢
System.out.println("第三次查詢:" + user1);
}
3.二級緩存
3.1.pojo
注意:當(dāng)我們在使用二級緩存時,所緩存的類一定要實現(xiàn)java.io.Serializable接口,這種就可以使用序列化方式來保存對象。
public class User implements Serializable {
private Integer id;
private String username;
private String password;
private Date birthday;
private String sex;
private String address;
//set get... ...
}
3.2.開啟二級緩存
1.在SqlMapConfig.xml 文件開啟二級緩存
2.配置相關(guān)的Mapper映射文件
3.3.測試二級緩存
@Test
public void testSecondUserById(){
SqlSession sqlSession1 = sqlSessionFactory.openSession();
UserDao userDao = sqlSession1.getMapper(UserDao.class);
User user1 = userDao.findUserById(41);//執(zhí)行查詢
System.out.println("第一次查詢:" + user1);
sqlSession1.commit();//二級緩存在sqlSession.commit()或者sqlSession.close()之后生效
SqlSession sqlSession2 = sqlSessionFactory.openSession();
UserDao userDao2 = sqlSession2.getMapper(UserDao.class);
User user2 = userDao2.findUserById(41);//不執(zhí)行查詢
System.out.println("第二次查詢:" + user2);
}
3.4.二級緩存分析
二級緩存是mapper映射級別的緩存,多個SqlSession去操作同一個Mapper映射的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。
二級緩存結(jié)構(gòu)圖:
3.5.測試清空二級緩存
@Test
public void testSecondUserById(){
SqlSession sqlSession1 = sqlSessionFactory.openSession();
UserDao userDao = sqlSession1.getMapper(UserDao.class);
User user1 = userDao.findUserById(43);//執(zhí)行查詢
System.out.println("第一次查詢:" + user1);
sqlSession1.commit();
SqlSession sqlSession3 = sqlSessionFactory.openSession();
UserDao userDao3 = sqlSession3.getMapper(UserDao.class);
userDao3.deleteUserById(41);
sqlSession3.commit();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
UserDao userDao2 = sqlSession2.getMapper(UserDao.class);
User user2 = userDao2.findUserById(43);不執(zhí)行查詢
System.out.println("第二次查詢:" + user2);
sqlSession2.commit();
sqlSession2.close();
}
柚子快報激活碼778899分享:MyBatis的緩存
推薦鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。