zoukankan      html  css  js  c++  java
  • mybatis 缓存

      在MyBatis中允许使用缓存,缓存一般都放置在可高速读/写的存储器上,比如服务器的内存,它能够有效提高系统的性能。因为数据库在大部分场景下是把存储在磁盘上的数据索引出来。从硬件的角度分析,索引磁盘是一个较为缓慢的过程,读取内存或者高速缓存处理器的速度要比读取磁盘快得多,其速度是读取硬盘的几十倍到上百倍,但是内存和高速缓存处理器的空间有限,所以一般只会把那些常用且命中率高的数据缓存起来,以便将来使用,而不缓存那些不常用且命中率低的数据缓存。因为命中率低,最后还是要在磁盘内查找,并不能有效提高性能。
      MyBatis分为一级缓存和二级缓存,同时也可以配置关于缓存的设置。

    一级缓存和二级缓存

      一级缓存是在SqlSession上的缓存,二级缓存是在SqlSes-sionFactory上的缓存。默认情况下,也就是没有任何配置的情况下,MyBatis系统会开启一级缓存,也就是对于SqlSession层面的缓存,这个缓存不需要POJO对象可序列化(实现java.io.Serializable接口)。
      首先在没有任何配置的环境下,测试一级缓存。虽然代码对同一对象进行了两次获取,但是实际只有一条SQL被执行,其原因是代码使用了同一个SqlSession对象获取数据。当一个SqlSession第一次通过SQL和参数获取对象后,它就会将其缓存起来,如果下次的SQL和参数都没有发生变化,并且缓存没有超时或者声明需要刷新时,那么它就会从缓存中获取数据,而不是通过SQL获取了。
      一级缓存是在SqlSession层面的,对于不同的SqlSession对象是不能共享的。为了使SqlSession对象之间共享相同的缓存,有时候需要开启二级缓存,开启二级缓存很简单,只要在映射文件(.xml)上加入代码:<cache/>这个时候MyBatis会序列化和反序列化对应的POJO,也就要求POJO是一个可序列化的对象,那么它就必须实现java.io.Serializable接口。对类对象进行缓存,那么就需要它实现Serializable接口
      如果Role类没有实现java.io.Serializable接口,那么MyBatis将会抛出异常,导致程序运行错误。
      不同的SqlSession在获取同一条记录,都只是发送过一次SQL获取数据。因为这个时候MyBatis将其保存在SqlSessionFactory层面,可以提供给各个SqlSession使用,只是它需要一个序列化和反序列化的过程而已,因此它需要实现Serializable接口。

    SqlSession sqlSession = null;
            SqlSession sqlSession2 = null;
            try {
                sqlSession = SqlSessionFactoryUtils.openSqlSession();
                sqlSession2 = SqlSessionFactoryUtils.openSqlSession();
    
                RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
                Role role = roleMapper.getRole(1L);  //需要提交,如果是一级缓存,MyBatis才会缓存对象到SqlSessionFactory层面
                System.out.println(role.toString());
                sqlSession.commit();
    
                logger.info("不同sqlSession再获取一次POJO......");
    
                RoleMapper roleMapper2 = sqlSession2.getMapper(RoleMapper.class);
                Role role2 = roleMapper2.getRole(1L);  //需要提交,MyBatis才缓存对象到SqlSessionFactory
                System.out.println(role2.toString());
                sqlSession2.commit();
    
            } catch (Exception e) {
                logger.info(e.getMessage(), e);
            } finally {
                if (sqlSession != null) {
                    sqlSession.close();
                }
                if (sqlSession2 != null) {
                    sqlSession.close();
                }
            }

    缓存配置项

      为了测试一级缓存,只配置了cache元素,加入了这个元素后,MyBatis就会将对应的命名空间内所有select元素SQL查询结果进行缓存,而其中的insert、delete和update语句在操作时会刷新缓存。缓存要明确cache元素的配置项,如表所示。

  • 相关阅读:
    隧道适配器,本地连接过多的解决办法
    C# 遍历HashTable
    sql2005 数据库转为sql 2000数据库的步骤
    自动扫描IP代理地址和自动切换IP的软件
    JS实现网页图片延迟加载[随滚动条渐显]
    批量修改hosts
    C#.NET获取当前月份最大天数
    如何让js调用不影响页面的加载速度?
    在sql中如何替换去掉回车符?
    Linq(01)对Linq的疑问及学习路径
  • 原文地址:https://www.cnblogs.com/ooo0/p/10951636.html
Copyright © 2011-2022 走看看