首页 > 其他分享 >Mybatis-终章

Mybatis-终章

时间:2022-12-02 16:33:07浏览次数:38  
标签:缓存 System 查询 println 二级缓存 Mybatis 终章 out

缓存

简介

缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。
缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。

  • 存在内存那种的临时数据
  • 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题

为什么使用

减少和数据库的交互次数,减少系统开销,提高系统效率

什么样的数据需要使用缓存

经常查询并且不经常改变的数据【可以使用】

Mybatis缓存

  • Mybatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率
  • Mybatis系统中默认定义了两级缓存:一级缓存二级缓存
    • 默认情况下,只有一级缓存开启。(SQLSession级别的缓存,也称为本地缓存)
    • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存
    • 为了提高扩展性,Mybatis定义了缓存接口Cache。可以通过实现Cache接口来自定义二级缓存

一级缓存

  • 一级缓存,也称为本地缓存
    • 与数据库同义词会话期间查询到的数据会放到本地缓存中
    • 以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库
public void test(){
        // 1. 获取 SqlSession 对象
        SqlSession sqlSession = MybatisUtils.getsqlSession();
        logger.info("info:进入testblogAdmin");
        // 2. 执行SQL 方式一 getMapper
        // 2.1 通过类对象获取mappler
        BlogAdminMapper adminDao =  sqlSession.getMapper(BlogAdminMapper.class);
        BlogAdmin blogAdmin = adminDao.getAdminId(1);

        System.out.println(blogAdmin);

        System.out.println("====================");
        BlogAdmin blogAdmin2 = adminDao.getAdminId(1);

        System.out.println(blogAdmin2);

        System.out.println(blogAdmin==blogAdmin2);

        // 3. 关闭SqlSession
        sqlSession.close();
    }

一级缓存

缓存失效的情况

缓存失效

二级缓存

默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:

<cache/>
  • 二级缓存页脚全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
  • 基于namespace级别的缓存,一个命名空间,对应一个二级缓存
  • 工作机制
    • 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
    • 如果当前会话关闭了,这个会话对应的一级魂村就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;
    • 新的会话查询信息,就可以从二级缓存中获取内容
    • 不同的mapper查出的数据会放在自己对应的缓存(map)中
      二级缓存

步骤

  • 显示的开启全局缓存
 <settings>
        <setting name="logImpl" value="LOG4J"/>
        <setting name="cacheEnabled" value="true"/>
    </settings>
  • 在当前Mapper.xml文件中使用二级缓存
<cache/>
<!--可自定义参数-->
<cache
            eviction="FIFO"
            flushInterval="60000"
            size="512"
            readOnly="true"/>
  • 测试 不通SQLSession 查询同一条id
 @Test
    public void test(){
        // 1. 获取 SqlSession 对象
        SqlSession sqlSession = MybatisUtils.getsqlSession();
        SqlSession sqlSession2 = MybatisUtils.getsqlSession();

        BlogAdminMapper mapper =  sqlSession.getMapper(BlogAdminMapper.class);
        BlogAdmin blogAdmin = mapper.getAdminId(1);

        System.out.println(blogAdmin);

        System.out.println("====================");
        BlogAdminMapper mapper2 =  sqlSession.getMapper(BlogAdminMapper.class);
        BlogAdmin blogAdmin2 = mapper2.getAdminId(1);

        System.out.println(blogAdmin2);

        System.out.println(blogAdmin==blogAdmin2);

        // 3. 关闭SqlSession
        sqlSession2.close();
        sqlSession.close();
    }

测试

需要将实体类序列化,否则会报错

Caused by:java.io.NotSerializableException:com.depressiom.pojo.BlogAdmin

Mybatis缓存原理

原理

自定义缓存Ehcache

  <!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
        <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-ehcache</artifactId>
            <version>1.2.1</version>
        </dependency>

EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。
Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。
Ehcache
Ehcache

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

<?xml version="1.0" encoding="UTF-8" ?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">

    <diskStore path="./tmpdir/Tmp_EhCache"/>

    <defaultCache
            eternal="false"
            maxElementsInMemory="10000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="1800"
            timeToLiveSeconds="259200"
            memoryStoreEvictionPolicy="LRU"/>

    <cache
            name="cloud_user"
            eternal="false"
            maxElementsInMemory="5000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="1800"
            timeToLiveSeconds="1800"
            memoryStoreEvictionPolicy="LRU"/>
</ehcache>

标签:缓存,System,查询,println,二级缓存,Mybatis,终章,out
From: https://www.cnblogs.com/depressiom/p/16944668.html

相关文章

  • 数据库面试题--Mybatis
    Mybatis1.什么是Mybatis?2.Mybatis的优缺点?3.Mybatis使用场合?4.#{}和${}的区别是什么?5.当实体类的属性名和表种字段名不一致怎么办?6.Mybatis是如何将sql执行结果......
  • mybatis 3中获得自增主键
    在MybatisMapper文件中添加属性“useGeneratedKeys”和“keyProperty”,其中keyProperty是Java对象的属性名!<insertid="insert"parameterType="Spa......
  • Mybatis入门笔记
    Mybatis环境JDBCjava基础JDK1.8Mysql5.7maven3.6.1开发工具ideaJunitSSM框架:配置文件的最好方式:看官网文档1简介1.1什么是mybatis?MyBatis是一款优秀的......
  • mybatis缓存
    mybatis缓存原理假设第一次向数据库发送查询请求,把返回的数据存在缓存里,mybatis缓存使用hashmap来存储数据,到第二次查询的时候,先到缓存里面查找有无这条数据,如果做......
  • MyBatis-入门
    1、第一个mybastis程序1.1导入jar包<mybatis.version>3.4.1</mybatis.version><mysql.version>5.1.47</mysql.version><!--mybatisbegin--><dependency>......
  • 1_第一个mybatis程序
    1.步骤:搭建环境,导入mybatis,编写代码,测试​ 1.1.新建一个maven,删除src使其成为父工程​ 1.2.导入依赖:数据库驱动以及mybatis,junit​ 1.3创建子模块,不用再次导包......
  • MyBatis批量插入的五种方式
    前言这里我列举了MyBatis和MyBatis-Plus常用的五种批量插入的方式,进行了详细的总结归纳。准备工作MyBatis利用For循环批量插入MyBatis的手动批量提交MyBatis以集合方......
  • Mybatis-plus的简单CRUD
    简单CRUD  插入不建议用UUID作为主键,而是用自增ID @TableId(value="id",type=IdType.AUTO) privateIntegerid;雪花算法:使用一个64bit的long型的数字作为......
  • MybatisPlus多表连接查询一对多分页查询数据
    一、序言在日常一线开发过程中,多表连接查询不可或缺,基于MybatisPlus多表连接查询究竟该如何实现,本文将带你找到答案。在多表连接查询中,既有查询单条记录的情况,又有列表查......
  • MyBatis~基于SqlSession的一级缓存和基于namespace的二级缓存
    映射语句文件中的所有select语句的结果将会被缓存。映射语句文件中的所有insert、update和delete语句会刷新缓存。缓存会使用最近最少使用算法(LRU,LeastRec......