知识点-一级缓存
1.目标
2.路径
证明一级缓存的存在
一级缓存分析
测试一级缓存清空
3.讲解
3.1 证明一级缓存的存在
@Test
public void testFindAll(){
//1. 获取sqlSession对象
SqlSession sqlSession = SqlSessionFactoryUtils.openSession();
//2. 通过sqlSession对象获取UserDao接口的代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//3. 调用UserDao接口的代理对象的findAll方法获取所有联系人的信息
List<User> userList = userDao.findAll();
for (User user : userList) {
System.out.println(user);
}
System.out.println("分割线----------------------------------");
UserDao userDao2 = sqlSession.getMapper(UserDao.class);
List<User> userList2 = userDao2.findAll();
for (User user : userList2) {
System.out.println(user);
}
//4. 提交事务关闭资源
SqlSessionFactoryUtils.commitAndClose(sqlSession);
}
复制代码
3.2 一级缓存分析
第一次发起查询用户 id 为 1 的用户信息,先去找缓存中是否有 id 为 1 的用户信息,如果没有,从数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。第二次发起查询用户 id 为 1 的用户信息,先去找缓存中是否有 id 为 1 的用户信息,缓存中有,直接从缓存中获取用户信息。
如果 sqlSession 去执行 commit 操作(执行插入、更新、删除),清空 SqlSession 中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。
3.3 测试一级缓存清空
@Test
public void testFindAll(){
//1. 获取sqlSession对象
SqlSession sqlSession = SqlSessionFactoryUtils.openSession();
//2. 通过sqlSession对象获取UserDao接口的代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//3. 调用UserDao接口的代理对象的findAll方法获取所有联系人的信息
List<User> userList = userDao.findAll();
for (User user : userList) {
System.out.println(user);
}
System.out.println("分割线----------------------------------");
//清除一级缓存: 1. sqlSession.close() 2. sqlSession.commit() 3. sqlSession.clearCache() 4. 数据发生增删改
sqlSession.clearCache()
UserDao userDao2 = sqlSession.getMapper(UserDao.class);
List<User> userList2 = userDao2.findAll();
for (User user : userList2) {
System.out.println(user);
}
//4. 提交事务关闭资源
SqlSessionFactoryUtils.commitAndClose(sqlSession);
}
复制代码
@Test
public void testFindAll(){
//1. 获取sqlSession对象
SqlSession sqlSession = SqlSessionFactoryUtils.openSession();
//2. 通过sqlSession对象获取UserDao接口的代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//3. 调用UserDao接口的代理对象的findAll方法获取所有联系人的信息
List<User> userList = userDao.findAll();
for (User user : userList) {
System.out.println(user);
}
System.out.println("分割线----------------------------------");
//清除一级缓存: 1. sqlSession.close() 2. sqlSession.commit() 3. sqlSession.clearCache() 4. 数据发生增删改
userDao.deleteById(9);
UserDao userDao2 = sqlSession.getMapper(UserDao.class);
List<User> userList2 = userDao2.findAll();
for (User user : userList2) {
System.out.println(user);
}
//4. 提交事务关闭资源
SqlSessionFactoryUtils.commitAndClose(sqlSession);
}
复制代码
4.小结
一级缓存: 依赖 sqlSession 对象的, 自带的不可卸载的. 一级缓存的生命周期和 sqlSession 一致
一级缓存清空
+ sqlSession 销毁
+ 增删改 提交之后
评论