Spring Boot项目中集成连接池及部分细节说明

news2024/9/22 15:32:52

连接池

  • 一,Connection连接
  • 二,数据库连接池
  • 三,集成数据库连接池
    • 1,Spring Boot默认连接池
    • 2,Druid连接池
    • 3,集成Druid(原生版本)
      • 3.1,引入依赖
      • 3.2,配置数据源
      • 3.3,编写配置文件
      • 3.4,开启Druid数据源监控
      • 3.5,测试
    • 4,集成Druid(Starter)
      • 4.1,引入依赖
      • 4.2,编写配置文件
      • 4.3,测试

为了节省数据库资源与提升运行效率,一般都会在项目中集成连接池,平时只是引入依赖,写好配置就直接用了,很多细节没有考虑过,这里做一下记录。

一,Connection连接

什么是Connection连接呢?
Connection对象是和数据库建立的通信连接对象,执行SQL的底层逻辑就要通过Connection对象实现。(讲得有点迷,不是太懂)
实际操作一下吧。
我们查到通过如下命令可以查到MySQL当前连接数量:

  • 该命令可以列出当前所有连接到MySQL的客户端,以及每个连接的详细信息,包括ID、用户、主机、数据库、命令、时间等。
mysql> SHOW PROCESSLIST;
  • 该命令将返回Threads_connected状态变量的当前值,该变量记录了已建立的当前连接数。
mysql> SHOW STATUS LIKE 'Threads_connected';

我们进入MySQL服务,执行上述的命令,下面是我本机执行的结果:
在这里插入图片描述
上面显示我本机的MySQL目前有两个连接,一个应该是我打开的这个命令行窗口的连接,另一个连接有可能是Navicat打开得,因为之前用Navicat查看过数据库。可以关掉Navicat的连接再试一次。
在这里插入图片描述
应该是了,关掉Navicat以后连接只有一个了,这样就容易理解Connection为什么是数据库连接对象了。

二,数据库连接池

上面我们知道了什么是Connection,那数据库连接池又是什么呢?
先来说说线程池Executors,我们通过Executors.newFixedThreadPool(10);可以创建一个定长的线程池,线程池里最大有10个线程,线程池创建了线程,执行完成任务后该线程不会销毁,而是放在线程池中,等待下一次任务的处理。
通过线程池,由此及彼,那数据库连接池也是预先创建一批数据库连接对象,将它们放入数据库连接池中,当有数据库操作任务时,就从连接池中取出预先创建好的连接对象来执行相应的任务。

三,集成数据库连接池

1,Spring Boot默认连接池

数据库连接池技术有:DBCP、tomcat-jdbc、C3P0、HikariCP、Druid等。
若没有引入额外的连接池,Spring Boot 2.x默认使用HikariCP作为项目的数据库连接池。
可以通过下面的代码测试当前项目的连接池:(Spring Boot版本:2.5.0)

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

@SpringBootTest
public class DataSourceTest {

    @Autowired
    private DataSource dataSource;

    @Test
    public void testDataSource() {
        System.out.println("连接类型:" + dataSource.getClass());
        try {
            // 获得数据库连接
            Connection connection = dataSource.getConnection();
            System.out.println("数据库连接对象:" + connection);
            // 关闭连接
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
连接类型:class com.zaxxer.hikari.HikariDataSource
数据库连接对象:HikariProxyConnection@991572261 wrapping com.mysql.cj.jdbc.ConnectionImpl@4199761d

可以发现Spring Boot默认集成的数据库连接池是HikariCP。HikariCP有着很高的性能和并发性,是SpringBoot默认使用的连接池。

2,Druid连接池

  • Druid是阿里巴巴开源的数据库连接池项目,后来贡献给了Apache开源;
  • Druid的作用是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;
  • Druid连接池内置强大的监控功能,其中的StatFilter功能,能采集非常完备的连接池执行信息,方便进行监控,而监控特性不影响性能;
  • Druid连接池内置了一个监控页面,提供了非常完备的监控信息,可以快速诊断系统的瓶颈。

3,集成Druid(原生版本)

Druid依赖有两个,一个是原生的依赖,另一个是再次封装的springboot-starter依赖。

3.1,引入依赖

原生依赖如下:

<!--druid-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.4</version>
</dependency>

除Druid外,还需引入下面的依赖

<!--各依赖版本需根据SpringBoot确定,当前项目SpringBoot:2.5.0-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.5.0</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <version>2.5.0</version>
</dependency>

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.25</version>
</dependency>

3.2,配置数据源

#设置数据库连接信息
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/tick_tack?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull
    username: root
    password: 12345
    # type指定数据源类型,当前类型Druid
    type: com.alibaba.druid.pool.DruidDataSource

用之前的代码测试数据源可以发现数据源已由HikariCP变为了Druid,数据源指定成功。

连接类型:class com.alibaba.druid.pool.DruidDataSource
数据库连接对象:com.mysql.cj.jdbc.ConnectionImpl@3c1908c8

3.3,编写配置文件

#设置数据库连接信息
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/tick_tack?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull
    username: root
    password: 12345
    # type可以指定数据源类型
    type: com.alibaba.druid.pool.DruidDataSource
    # druid数据源相关配置
    # 初始化大小
    initialSize: 5
    # 最小连接数
    minIdle: 10
    # 最大连接数
    maxActive: 20
    # 获取连接时的最大等待时间
    maxWait: 60000
    # 一个连接在池中最小生存的时间,单位是毫秒
    minEvictableIdleTimeMillis: 300000
    # 多久才进行一次检测需要关闭的空闲连接,单位是毫秒
    timeBetweenEvictionRuns-millis: 60000
    #验证库是否正常sql
    validationQuery: select 'x'
    #空闲时验证,防止连接断开
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    # 打开PSCache,并且指定每个连接上PSCache的大小
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    filters: stat,wall,slf4j
    # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

3.4,开启Druid数据源监控

Druid数据源具有监控的功能,并提供了一个web界面方便用户查看。以下配置文件中配置了Druid监控后台的Servlet,以及Web和Druid数据源之间的管理关联监控统计。

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.HashMap;

/**
 * @author zhhao
 * @date 2024-01-30 12:02
 * @describe
 */
@Configuration
public class DruidConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")//和配置文件绑定
    public DataSource druidDataSource(){
        return new DruidDataSource();
    }

    //获取后台监控
    @Bean
    //由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。
    // 所以想用使用Servlet功能,就必须要借用SpringBoot提供的ServletRegistrationBean接口。
    public ServletRegistrationBean servletRegistration(){
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");   //StatViewServlet用于展示Druid的统计信息

        //设置后台登录的账户和密码
        HashMap<String, String> initParameters = new HashMap<>();

		// IP白名单
        initParameters.put("allow","");
        // IP黑名单(共同存在时,deny优先于allow)
        initParameters.put("deny","");

        //增加配置 登录的key是固定的
        initParameters.put("loginUsername","admin");
        initParameters.put("loginPassword","123456");

        //设置谁可以访问
        initParameters.put("allow","");//任何人都可以访问

        //设置初始化参数
        bean.setInitParameters(initParameters);

        return bean;
    }

    /**
     * 用于配置Web和Druid数据源之间的管理关联监控统计
     * @return
     */
    @Bean
    public FilterRegistrationBean webStartFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());

        //可以过滤的请求
        HashMap<String, String> initParameters = new HashMap<>();

        //排除一些不必要的url
        initParameters.put("exclusions","*.js,*.css,/druid/*");

        bean.setInitParameters(initParameters);//设置初始化参数
        return bean;
    }

}

3.5,测试

  • 监控页面:http://localhost:7080/demo/druid/
    • 7080:项目端口
    • demo:上下文路径,具体看配置文件中是否有配置

刚打开页面里面没有数据,当执行了SQL后,会显示执行的SQL,以及当前数据源的配置信息。
在这里插入图片描述

  • 测试数据库连接数:
    配置文件中初始化连接数为5,可以启动项目测试一下看连接是否生效。
    项目未启动时数据库连接数:只有一个连接,是我们打开的命令行窗口
    在这里插入图片描述
  • 项目启动后:
    在这里插入图片描述
    数据库连接数变为了6个,多出来的一个是CMD窗口连接,说明配置生效。

4,集成Druid(Starter)

4.1,引入依赖

该依赖是封装后的springboot-starter依赖,可以更方便的集成到Spring Boot项目中。
Github:druid-spring-boot-starter

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.1</version>
</dependency>

4.2,编写配置文件

#设置数据库连接信息
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/tick_tack?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull
    username: root
    password: 12345
    # type可以指定数据源类型
    type: com.alibaba.druid.pool.DruidDataSource
    # druid数据源相关配置
    druid:
      # 初始化大小
      initial-size: 5
      # 最小连接数
      min-idle: 5
      # 最大连接数
      max-active: 20
      # 获取连接时的最大等待时间
      max-wait: 60000
      # 一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 300000
      # 多久才进行一次检测需要关闭的空闲连接,单位是毫秒
      time-between-eviction-runs-millis: 60000
      # 检测连接是否有效的sql语句,为空时以下三个配置均无效
      validation-query: select 1
      # 申请连接时执行validationQuery检测连接是否有效,默认true,开启后会降低性能
      test-on-borrow: true
      # 归还连接时执行validationQuery检测连接是否有效,默认false,开启后会降低性能
      test-on-return: true
      # 申请连接时如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效,默认false,建议开启,不影响性能
      test-while-idle: true
      stat-view-servlet:
        # 是否开启StateViewServlet
        enabled: true
        # 访问监控页面 白名单,默认127.0.0.1
        allow: 127.0.0.1
        # 访问监控页面 黑名单
        deny: 192.168.56.1
        login-username: admin
        login-password: 123456
      filter:
        stat:
          # 是否开启FilterStat,默认为true
          enabled: true
          # 是否开启慢SQL记录,默认false
          log-slow-sql: true
          # 河北多个连接池的监控数据,默认false
          merge-sql: false

引入spring-boot-starter依赖后就不需要再额外编写配置类了,上面的配置文件里可以配置监控信息

4.3,测试

启动项目,监控页面:http://localhost:7080/demo/druid/
在这里插入图片描述
查看数据库连接数也可以发现连接数已建立
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1421431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS 实现立体字效果

我们在工作中&#xff0c;很多场景会遇到立体文字&#xff0c;今天我们就来实现下&#xff0c;很简单&#xff0c;算是水文章吧&#xff1a; <h1>立体字体</h1>h1 {margin: 100px 0 0 100px;font-size: 5em;color: #fff;text-shadow: -1px 1px #bbb,-2px 2px #bbb…

设计模式——职责链模式(Chain of Responsibility Pattern)

概述 职责链模式(Chain of Responsibility Pattern)&#xff1a;避免请求发送者与接收者耦合在一起&#xff0c;让多个对象都有可能接收请求&#xff0c;将这些对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有对象处理它为止。职责链模式是一种对象行为…

深度学习(9)--pydot库和graphviz库安装流程详解

目录 一.pydot库安装 二.graphviz库安装 一.pydot库安装 pydot的安装可直接在编译器安装相关包&#xff0c;以PyCharm举例&#xff1a; 如果搜索可用软件包显示为空&#xff0c;记得在此处把使用Conda软件包管理器”点亮 二.graphviz库安装 点击链接下载安装包graphviz-2.38…

DX-11A DC0.075A 型信号继电器 柜内安装,板前接线

DX-11信号继电器&#xff1b; DX-11A信号继电器&#xff1b; DX-11B信号继电器&#xff1b; DX-11C信号继电器&#xff1b; DX-11Q信号继电器&#xff1b; DX-11A/Q信号继电器&#xff1b; DX-11B/Q信号继电器&#xff1b; DX-11C/Q信号继电器&#xff1b; 一. 用途 DX-11/0.…

.net core 6 集成 elasticsearch 并 使用分词器

1、nuget包安装NEST、安装elasticsearch、kibana、ik分词器、拼音分词器 2、创建操作对象 //索引库 static string indexName "testparticper"; //es 操作对象 ElasticClient elasticClient new ElasticClient(new ConnectionSettings(new Uri("http://192.…

Python使用分治算法作归并排序

对于分治算法的一个较为常规的应用中&#xff0c;归并排序是一个使用分治算法的排序方式。给定一个随机排序的数组&#xff0c;我们要将其元素按照升序或者降序的方式进行排序&#xff0c;可以设想到这样的一种算法&#xff0c;如果一个数组的上半部分和下半部分已经排好序&…

(HAL)STM32F407ZGT6——10-4 高级定时器 PWM 输入模式实验

一、高级定时器简介 高级定时器的框图和通用定时器框图很类似&#xff0c;只是添加了其它的一些功能&#xff0c;如&#xff1a;重复计数器、带死区控制的互补输出通道、断路输入等。 高级定时器的时钟来自APB2, 而PCLK2 168Mhz, 我们设置PPRE2不分频, 因此高级定时器时钟 …

如何通过Hive/tez与Hadoop的整合快速实现大数据开发

一、Hive的功能 Hive是基于Hadoop的一个外围数据仓库分析组件&#xff0c;可以把Hive理解为一个数据仓库&#xff0c;但这和传统的数据库是有差别的。 传统数据库是面向业务存储&#xff0c;比如 OA、ERP 等系统使用的数据库&#xff0c;而数据仓库是为分析数据而设计的。同时…

05 MyBatis之表关系的声明+事务+SqlSession三件套的作用域

MyBatis 支持一对一&#xff0c;一对多&#xff0c;多对多查询。XML 文件和注解都能实现关系的操作。多对多实质就是一对多 1. 表关系的维护 1.1 One一对一 一对一查询和多表(两表)查询很相似, 都能查询两表的全部属性 区别是一对一可以在对象中嵌套对象, 呈现包含关系; 多表…

Kotlin快速入门系列9

Kotlin对象表达式和对象声明 对象表达式 有时&#xff0c;我们想要创建一个对当前类有些许修改的对象同时又不想重新声明一个子类。如果是Java&#xff0c;可以用匿名内部类的概念来解决这个问题。kotlin的对象表达式和对象声明就是为了实现这一点(创建一个对某个类做了轻微改…

Java 开发环境 全套包含IDEA

一、JDK配置 1.下载 JDK Builds from Oracle 去这边下载open JDK 2.JDK环境变量配置 按win&#xff0c;打开设置 找到环境变量编辑 这边输入的是你下载的那个JDK的bin的路径 检擦配置是否正确在cmd中输入 二、IDEA安装配置 1.下载&#xff08;社区版&#xff09; JetBrai…

干货 | 大模型在图数据分析、推荐系统和生物科学中的综合应用

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 图机器学习、推荐系统与大语言模型的融合正成为新的前沿热点。图机器学习通过利用图结构数据&#xff0c;能够有效地捕捉和分析复杂关系和模式。同时&#xff0c;推荐系统正逐步成为我们日常生活的一部分&#…

华为——NGFW Module安装在集群交换机上,二层双机负载分担部署,交换机重定向引流

NGFW Module安装在集群交换机上&#xff0c;二层双机负载分担部署&#xff0c;交换机重定向引流 业务需求 如图1所示&#xff0c;两台交换机集群组网&#xff0c;两块NGFW Module分别安装在两台交换机的1号槽位组成双机负载分担组网。NGFW Module工作在二层&#xff0c;也就是…

走进水稻种植教学基地可视化:科技与农业知识的完美结合

随着科技的不断发展&#xff0c;农业领域也在不断创新和进步。水稻种植教学基地可视化系统是一种基于现代信息技术手段的教学方式&#xff0c;通过虚拟现实、3D建模等技术&#xff0c;将水稻种植的全过程进行模拟和展示。这种教学方式打破了传统农业教学的局限性&#xff0c;使…

腾讯云部署vue+node项目

文章目录 一、安装宝塔二、vue项目部署三、node项目部署 前言: 关于项目部署,一开始也是找了很多资料,费了点时间,所以记录一下。希望能对各位有所帮助。 一、安装宝塔 1.首先在控制台,进入云服务器的终端界面 2.输入命令和密码获取权限,并且安装宝塔界面 yum install -y w…

关于在Tkinter + Pillow图片叠加中出现的问题

这段时间我一直在尝试对多图层图片进行一个叠加的操作&#xff0c;想用tkinter实现出来&#xff0c;先看错误 这里我其实已经选择了图片&#xff0c;但是发现是ValueError&#xff0c;我尝试断点检测但是也无动于衷&#xff0c;因为设置变量检测的时候发现变量并没有错误&…

Opencv——图片卷积

图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 线性滤波是图像处理最基本的方法,它允许我们对图像进行处理,产生很多不同的效果。首先,我们需要一个二…

大数据学习之Redis,十大数据类型的具体应用(三)

目录 3.7 Redis位图&#xff08;bitmap&#xff09; 概念 需求 是什么 说明 能干嘛? 基本命令 3.7 Redis位图&#xff08;bitmap&#xff09; 概念 由0和1状态表现的二进制位的bit数组 需求 用户是否登陆过&#xff1f;Y / N 广告是否被点击过&#xff1f; 钉钉打…

【机器学习】常见算法详解第2篇:KNN之kd树介绍(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习&#xff0c;伴随浅显易懂的数学知识&#xff0c;让大家掌握机器学习常见算法原理&#xff0c;应用Scikit-learn实现机器学习算法的应用&#xff0…

外汇监管牌照解析:确保交易安全与合规性

外汇交易中&#xff0c;资金安全与平台监管是大家最关心的话题。监管是评估外汇经纪商是否值得信赖、是否具备相关资质的关键依据&#xff0c;因此选择一家拥有海外合法监管的经济商至关重要。 那么&#xff0c;今天我们就来聊聊全球权威的几大监管机构 — FCA、ASIC、NFA、FSA…