spring和mybatis中的连接池和缓存

文章目录

十、连接池

10.1连接池

  1. 连接池是什么:存储连接的容器

  2. 解决了什么问题

    • 如果没有连接池,每次执行sql语句都需要创建connection的连接,会浪费时间,影响程序的性能。
  3. 提前创建一些连接,存储到连接池中,使用的时候从连接池获取连接即可

  4. 常用的连接池

    1. c3p0

    2. dbcp

    3. druid(阿里)

  5. 连接池有归还的操作,已经对close方法进行了增强,原来是关闭连接,现在是归还

10.2、mybatis连接池的分类

  1. 在解析mybatis-config.xml配置文件的时候,创建dataSource对象,存入到Environment对象中。

  2. 当执行SQL语句的时候,准备从dataSource对象中获取链接。

十一、mybatis的缓存

一级缓存和二级缓存

一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从一级缓存中直接获取,不会从数据库重新查询。一级缓存默认是开启

使用一级缓存失效的四种情况:

11.1、不同的SqlSession对应不同的一级缓存。
java 复制代码
@Test
public void testGetEmpById(){
    SqlSession sqlSession1 = SqlSessionUtil.getSqlSession();
    System.out.println(sqlSession1);
    SqlSession sqlSession2 = SqlSessionUtil.getSqlSession();
    System.out.println(sqlSession2);

    EmpMapper empMapper1 = sqlSession1.getMapper(EmpMapper.class);
    Emp emp1 = empMapper1.getEmpById(1);
    System.out.println(emp1);
    System.out.println("-----------------------------------");
    EmpMapper empMapper2 = sqlSession2.getMapper(EmpMapper.class);
    Emp emp2 = empMapper2.getEmpById(1);
    System.out.println(emp2);
}

2、同一个SqlSession但是查询条件不同。

3、同一个SqlSession两次查询之间,执行了任何一次增删改操作

java 复制代码
Emp emp1 = empMapper.getEmpById(1);
System.out.println(emp1);

empMapper.insertEmp(new Emp(null,"小张",23,"男"));

Emp emp2 = empMapper.getEmpById(1);
System.out.println(emp2);

4、同一个SqlSession两次查询之间,手动清空了缓存

java 复制代码
//手动清空一级缓存
sqlSession.clearCache();
11.2、MyBatis的二级缓存

二级缓存是SqlSessionFactory级别的,通过同一个SqlSessionFactory创建的SqlSession查询的结果都会被缓存;下次查询相同的数据,就会从二级缓存中直接获取,不会从数据库重新查询。二级缓存默认是不开启的

二级缓存开启的条件:

1、在核心配置文件中,设置全局配置属性cacheEnabled="true" ,默认为true。所以不需要设置

2、在映射文件中设置标签

3、二级缓存必须在SqlSession关闭之后生效

4、查询的数据所转换的实体类类型必须实现序列化的接口

java 复制代码
public class Emp implements Serializable 
java 复制代码
@Test
public void testCache() throws IOException {
    InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    /*sqlSession1和sqlSession2都是sqlSessionFactory创建的*/
    SqlSession sqlSession1 = sqlSessionFactory.openSession(true);
    EmpMapper empMapper1 = sqlSession1.getMapper(EmpMapper.class);
    Emp emp1 = empMapper1.getEmpById(1);
    System.out.println(emp1);
    sqlSession1.close();
    System.out.println("-----------------------");

    SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
    EmpMapper empMapper2 = sqlSession2.getMapper(EmpMapper.class);
    Emp emp2 = empMapper2.getEmpById(1);
    System.out.println(emp2);
    sqlSession2.close();
}

Cache Hit Ratio:二级缓存命中率,不为0,说明程序直接从二级缓存中获取了数据

使二级缓存失效的情况:

两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效

11、3二级缓存的相关配置

在mapper配置文件中添加的cache标签可以设置一些属性:

①eviction属性:缓存回收策略,默认的是 LRU。

LRU(Least Recently Used) -- 最近最少使用的:移除最长时间不被使用的对象。

FIFO(First in First out) -- 先进先出:按对象进入缓存的顺序来移除它们。

SOFT -- 软引用:移除基于垃圾回收器状态和软引用规则的对象。

WEAK -- 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

②flushInterval属性:刷新间隔,单位毫秒

默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新

③size属性:引用数目,正整数代表缓存最多可以存储多少个对象,太大容易导致内存溢出

④readOnly属性:只读, true/false

true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。

false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。

11.4、mybatis缓存查询的顺序

先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。

如果二级缓存没有命中,再查询一级缓存

如果一级缓存也没有命中,则查询数据库

SqlSession关闭之后,一级缓存中的数据会写入二级缓存

11.5整合第三方的缓存EhCache

11.5.1添加依赖

xml 复制代码
<!-- Mybatis EHCache整合包 -->
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.2.1</version>
</dependency>
<!-- slf4j日志门面的一个具体实现 -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>	

11.5.2各jar的功能

jar包名称 作用
mybatis-ehcache Mybatis和EHCache的整合包
ehcache EHCache核心包
slf4j-api SLF4J日志门面包
logback-classic 支持SLF4J门面接口的一个具体实现

11.5.3创建EHCache配置文件ehcache.xml

xml 复制代码
<?xml version="1.0" encoding="utf-8" ?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
    <!-- 磁盘保存路径 -->
    <diskStore path="D:\qingcheng\ehcache"/>
    <defaultCache
            maxElementsInMemory="1000"
            maxElementsOnDisk="10000000"
            eternal="false"
            overflowToDisk="true"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
    </defaultCache>
</ehcache>

11.5.4设置二级缓存的类型

xml 复制代码
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

11.5.5加入logback日志

存在SLF4J时,作为简易日志的log4j将失效,此时需要借助SLF4J的具体实现logback来打印日志,创建logback的配置文件logback.xml

11.5.6EHCache配置文件说明

属性名 是否必须 作用
maxElementsInMemory 在内存中缓存的element的最大数目
maxElementsOnDisk 在磁盘上缓存的element的最大数目,若是0表示无穷大
eternal 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds、timeToLiveSeconds判断
overflowToDisk 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
timeToIdleSeconds 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
diskSpoolBufferSizeMB DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
diskPersistent 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
diskExpiryThreadIntervalSeconds 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
memoryStoreEvictionPolicy 当内存缓存达到最大,有新的element加入的时候,移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)

|

| diskExpiryThreadIntervalSeconds | 否 | 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作 |

| memoryStoreEvictionPolicy | 否 | 当内存缓存达到最大,有新的element加入的时候,移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出) |

11.5.7 测试还用之前的测试方法即可

相关推荐
宁&沉沦5 分钟前
Nginx清除浏览器缓存的三个缓存响应头的关系详解
运维·nginx·缓存
阿琦学代码1 小时前
Spring Cloud(微服务) 概述
后端·spring·spring cloud
Filotimo_1 小时前
Spring MVC 数据校验
java·spring·mvc
Slow菜鸟1 小时前
SpringBoot集成Elasticsearch | Spring官方场景启动器(Spring Data Elasticsearch)方式
spring boot·spring·elasticsearch
.柒宇.2 小时前
《云岚到家》第一章个人总结
spring boot·spring·spring cloud
lang201509282 小时前
Spring XML AOP配置实战指南
xml·java·spring
جيون داد ناالام ميづ2 小时前
Spring事务原理探索
java·后端·spring
艾菜籽3 小时前
MyBatis动态sql与留言墙联系
java·数据库·sql·spring·mybatis
山河亦问安3 小时前
SpringBoot3整合JetCache缓存
缓存
l0sgAi3 小时前
PageHelper-Cursor:支持游标分页的 PageHelper 修改版,解决 MyBatis 深分页性能问题
spring boot·mybatis