zoukankan      html  css  js  c++  java
  • mybatis学习笔记(14)-查询缓存之中的一个级缓存

    mybatis学习笔记(14)-查询缓存之中的一个级缓存

    标签: mybatis



    本文主要讲mybatis的一级缓存。一级缓存是SqlSession级别的缓存。

    查询缓存

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

    mybaits提供一级缓存,和二级缓存。

    查询缓存

    一级缓存是SqlSession级别的缓存。在操作数据库时须要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

    二级缓存是mapper级别的缓存。多个SqlSession去操作同一个Mapper的sql语句。多个SqlSession能够共用二级缓存,二级缓存是跨SqlSession的。

    为什么要用缓存?

    假设缓存中有数据就不用从数据库中获取。大大提高系统性能。

    一级缓存

    一级缓存工作原理

    一级缓存工作原理

    第一次发起查询用户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

  • 相关阅读:
    C# Math.Round的枚举参数
    Literature Review: Incremental Segment-Based Localization in 3D Point Clouds
    Literature Review: Benchmarking 6DOF Outdoor Visual Localization in Changing Conditions
    Literature Review: Improving Image-Based Localization by Active Correspondence Search
    Literature Review: 基于稀疏直接法的建图
    论文阅读: 基于SLAM的使用GPS和鱼眼相机第Integrity Monitoring
    论文阅读: v-charge项目: 电动车的自动泊车和充电
    论文阅读: Infrastructure-Based Calibration of a Multi-Camera Rig
    论文阅读: Building a 3-D Line-Based Map Using Stereo SLAM
    论文阅读: VITAMIN-E: Extremely Dense Feature Points
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7267788.html
Copyright © 2011-2022 走看看