• 【Mybatis框架】查询缓存(一级缓存)


    Java的各位程序员们,估计SSH和SSM是我们的基础必备框架。也就是说我们都已经至少接触过了这两套常见的集成框架。当我们用SSH的时候,相信很多人都接触过hibernate的两级缓存,同样,相对应的,Mybatis也存在着两级缓存。接下来,我们就来介绍一下Mybatis的一、二级缓存。

    首先我们要知道什么是查询缓存?查询缓存又有什么作用?

    功能:mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。        

    用图来表示如下图:

    粗略的解释一下就是:        

            一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。所以在这种情况下,是不能实现跨表的session共享的         二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是横跨跨SqlSession的。相信不用我再给大家去解释什么事Mapper了吧!

    那我们就先说一下Mybatis的一级缓存

    画一个简单的图吧:

    这个图好像有点显眼啊,就这样吧先。

    首先从图上,我们可以看出,一级缓存区域是根据SqlSession为单位划分的。每次查询都会先从缓存区与找,如果找不到就会从数据库查询数据,然后将查询到的数据写入一级缓存中。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+sql语句。而value值就是从查询出来映射生成的java对象。而为了保证缓存里面的数据肯定是准确数据避免脏读,每次我们进行数据修改后(增删改)就会执行commit操作,清空缓存区域。

    说到这里,我们来做一下测试

    1. //获取session  
    2.     SqlSession session = sqlSessionFactory.openSession();  
    3. //获限mapper接口实例  
    4.     UserMapper userMapper = session.getMapper(UserMapper.class);  
    5. //第一次查询  
    6.     User user1 = userMapper.findUserById(1);  
    7.     System.out.println(user1);  
    8. //第二次查询,由于是同一个session则不再向数据发出语句直接从缓存取出  
    9.     User user2 = userMapper.findUserById(1);  
    10.     System.out.println(user2);  
    11. //关闭session  
    12.     session.close();  


    结果图:

    而当我们提交Commit之后呢?

    1. //获取session  
    2.     SqlSession session = sqlSessionFactory.openSession();  
    3. //获限mapper接口实例  
    4.     UserMapper userMapper = session.getMapper(UserMapper.class);  
    5. //第一次查询  
    6.     User user1 = userMapper.findUserById(1);  
    7.     System.out.println(user1);  
    8. //在同一个session执行更新  
    9.     User user_update = new User();  
    10.     user_update.setId(1);  
    11.     user_update.setUsername("张三");  
    12.     userMapper.updateUser(user_update);  
    13.     session.commit();  
    14. //第二次查询,虽然是同一个session但是由于执行了更新操作session的缓存被清空,这里重新发出sql操作  
    15.     User user2 = userMapper.findUserById(1);  
    16.     System.out.println(user2);  


    效果图

    由此可见,Mybatis的一级缓存是存在与SqlSession中,可以提高我们的查询性能,但是不能实现多sql的session的共享。

  • 相关阅读:
    多测师讲解html _伪类选择器17_高级讲师肖sir
    多测师讲解html _后代选择器16_高级讲师肖sir
    多测师讲解html _组合选择器_高级讲师肖sir
    多测师讲解html _标签选择器14_高级讲师肖sir
    前端 HTML form表单标签 input标签 type属性 重置按钮 reset
    前端 HTML form表单标签 textarea标签 多行文本
    前端 HTML form表单标签 input标签 type属性 file 上传文件
    前端 HTML form表单标签 input标签 type属性 radio 单选框
    前端 HTML form表单标签 input标签 type属性 checkbox 多选框
    前端 HTML form表单目录
  • 原文地址:https://www.cnblogs.com/DoubleEggs/p/6243217.html
Copyright © 2020-2023  润新知