Spring Boot整合Druid(druid 和 druid-spring-boot-starter)

引言

在现代的Web应用开发中,高性能的数据库连接池是确保应用稳定性和响应性的关键因素之一。Druid是一个开源的高性能数据库连接池,具有强大的监控和统计功能,能够在Spring Boot应用中提供出色的数据库连接管理。本文将研究在Spring Boot中集成Druid连接池的步骤,以及如何通过其丰富的特性优化应用的数据库性能。

数据库连接池

数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态的对池中的连接进行申请、使用、释放。

为什么需要使用数据库连接池

数据库连接是一件费时的操作,连接池可以使多个操作共享一个链接:数据库连接池的基本思想就是为数据库连接建立一个缓冲池,与现在缓冲池中放入一定数量
的连接,当需要建立数据库连接时,只需从缓冲池中取出一个,使用完毕后再放回去:使用数据库连接池可以提高对数据库连接资源的管理,数据库连接池负责分
配、管理和释放数据库连接,允许程序重复使用一个现有的数据库连接,而不是重新建立一个;可以通过设定连接池最大连接数来防止系统无尽的与数据库连接

常见的连接池种类

  1. JDBCP连接池:采用标准的Java EE JDBC AP来实现,同时支持NDl,非常灵活;但是版本比较老了,而且在高并发场景下性能可能存在问题
  2. c3p0连接池:功能齐全,能够自动维护连接池,支持JDBC3规范和JDBC2的标准扩展,性能较好:但是配置过于复杂,容易造成资源浪费
  3. HikariCPi连接池:专为高并发场景设计,性能优越,具有最快的初始化速度和最小的延迟,支持JDBC4 API;但是由于需要更多的VM资源,可能会造成资源消耗问题
  4. druid连接池:支持DBC和Dracle驱动程序,全面的性能监测,对等分布式,具有强大的扩展功能和高度定制化配置

Druid介绍

Druid是一个阿里巴巴结合了c3p0、DBCP等DB池的优点开源的数据库连接池和SQL查询优化工具,用于提高应用程序对数据库的性能和可扩展性。主要提供的功能:数据库连接池、数据库连接池监控、SQL查询优化、数据源管理、防御SQL注入、统计和监控。
注意:SpringBoot2.0默认是用com.zaxxer.hikari.HikariDataSource作为数据源。

  • Druid功能
  1. 数据源监控: 显示数据源的基本信息、活跃连接数、连接等待数量等。

  2. SQL监控: 统计SQL执行的次数、执行时间、错误次数等,帮助优化SQL性能。

  3. 日志监控: 展示Druid内部日志,帮助定位问题。

  4. 防火墙监控: 配置SQL防火墙规则,提高数据库安全性。

查看当前数据源的测试代码
@SpringBootTest
public class DruidTest {
    @Autowired
    private DataSource dataSource;

    @Test
    void test(){
        System.out.println(dataSource.getClass());
    }
}


druid 和 druid-spring-boot-starter区别

  • druid-spring-boot-starter 是在 druid 基础上进行了封装,专用于集成 spring-boot 项目,无需编写配置类文件。个性化的配置。为专用格式。按照SpringBoot整合其他技术的通用规则来,导入对应的starter,进行相应的配置即可。
  • druid 需要自己手动编写一个配置类文件。为通用格式,不管你换什么数据源都可以用这种形式进行配置。

druid传统的配置

  • 引入Druid依赖

在Spring Boot项目的pom.xml文件中,引入Druid和数据库驱动的相关依赖:

<!-- MyBatis-Plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>

<!-- MySQL Connector 数据库驱动  -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>
  • 配置Druid连接池

application.propertiesapplication.yml中配置Druid连接池的相关参数:

spring:
    datasource:
        username: root
        password: root
        #?serverTimezone=UTC解决时区的报错
        url: jdbc:mysql://localhost:3306/druid
        driver-class-name: com.mysql.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource

        #Spring Boot 默认是不注入这些属性值的,需要自己绑定
        #druid 数据源专有配置
        initialSize: 5
        minIdle: 5
        maxActive: 20
        maxWait: 60000
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true

        #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
        #如果允许时报错  java.lang.ClassNotFoundException: org.apache.log4j.Priority
        #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
        filters: stat,wall,log4j
        maxPoolPreparedStatementPerConnectionSize: 20
        useGlobalDataSourceStat: true
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

注意:这些配置暂时还没生效,因为这会还没有把自定义的属性配置上去
我们在配置文件中配置最大连接数为20,初始化连接数为5
测试一下看看

  • 引入Druid依赖(根据自己配置参数按需引入)
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
  • 绑定全局配置文件中的参数
package com.example.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

//这是一个配置类 需要加@Configuration 这个注解
@Configuration
public class DruidConfig {

    /*
      将 自定义的 Druid数据源 添加到容器中,不再让 Spring Boot 自动创建(自动创建的是HikariDataSource)
      绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource从而让它们生效,绑定操作就是加上以下注解
      @ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中
      前缀为 spring.datasource的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中
    */
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }
}

然后我们再测试一下刚才的测试方法看看配置是否生效

  • 配置Druid数据源监控

Druid数据源具有监控的功能,并提供了一个web界面方便用户查看。我们需要设置Druid,后台管理页面,如登录账号、密码等.

 //配置 Druid 监控管理后台的Servlet;
    //因为springboot内置了 Servlet 容器,所以没有了web.xml文件, 替代的方法就是 ServletRegistrationBean (Spring Boot的注册 Servlet方式)
    @Bean
    public ServletRegistrationBean statViewServlet() {
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");

        // 这些参数可以在 com.alibaba.druid.support.http.StatViewServlet 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到
        //后台需要有人登录,账号密码的配置
        Map<String, String> initParams = new HashMap<>();
        initParams.put("loginUsername", "admin"); //后台管理界面的登录账号
        initParams.put("loginPassword", "admin"); //后台管理界面的登录密码

        //后台允许谁可以访问
        //initParams.put("allow", "localhost"):表示只有本机可以访问
        //initParams.put("allow", ""):为空或者为null时,表示允许所有访问
        initParams.put("allow", "");
        //deny:Druid 后台拒绝谁访问 initParams.put("user", "192.168.1.10");表示禁止此ip访问

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

启动项目,访问http://localhost:8080/druid/login.html

输入配置账号登录

  • 配置Druid Web监控Filter过滤器
//配置 Druid 监控 之  web 监控的 filter  (在之前是在web.xml中配置过滤器)
    //WebStatFilter:用于配置Web和Druid数据源之间的管理关联监控统计
    @Bean
    public FilterRegistrationBean webStatFilter() {
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());

        //exclusions:设置哪些请求进行过滤排除掉,从而不进行统计
        Map<String, String> initParams = new HashMap<>();
        initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*");  //这些东西不进行统计
        bean.setInitParameters(initParams);

        // "/*" 表示过滤所有请求
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }

druid-spring-boot-starter配置

  • 引入Druid配置

依赖是druid-spring-boot-starter,它基于传统的druid进行了封装,简化了配置,所以使用该依赖,同时引入log4j2的日志依赖,方便我们在监控时获取日志信息。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.16</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
  • Druid配置

基于application.yml进行配置


spring:
    application:
        name: druid-demo
    datasource:
        # 数据库相关配置
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/mybatis01
        username: root
        password: root
        druid:
            # 初始化连接数量
            initial-size: 5
            # 最小线连接数量
            min-idle: 5
            # 最大连接数量
            max-active: 20
            # 获取连接时最大等待时间,单位毫秒
            max-wait: 60000
            #销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接
            min-evictable-idle-time-millis: 30000
            #用来检测连接是否有效的sql 必须是一个查询语句
            #mysql中为 select 'x'
            #oracle中为 select 1 from dual
            validation-query: select 'x'
            #申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
            test-on-borrow: false
            #归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为tru
            test-on-return: false
            # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
            # 配置监拉统计挡成的filters. stat: 监控统计、Log4j:日志记录、waLL: 防御sqL注入
            filters: stat,wall,log4j2
            # 配置后台监控
            stat-view-servlet:
                # 允许访问的地址,这里因为时本地所以配置当前机器
                allow: 127.0.0.1
                # 是否开启访问
                enabled: true
                # 是否能够重置数据
                reset-enable: false
                # 管理页面登陆的用户名
                login-username: admin
                # 管理页面登陆的密码
                login-password: admin

可以看到相较于传统的配置(不需要配置DruidConfig,仅仅作为对比)方式:

更加简洁了,开发人员只需要专注于配置信息,就可以快速的配置启用druid了,大大的提高了开发效率

结语

通过本文的介绍,你已经学会了在Spring Boot中集成Druid连接池的全过程,并了解了如何通过Druid的监控页面进行实时监控和统计。Druid连接池不仅提供了高性能的连接池功能,还附带了丰富的监控和统计工具,助力开发者更好地管理和优化数据库性能。在实际项目中,合理配置Druid连接池参数,结合监控页面,将会使应用的数据库性能达到事半功倍的效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【双端队列】【维护单调队列】Leetcode 239 滑动窗口最大值【难】

【双端队列】Leetcode 239 滑动窗口最大值 双端队列的操作解法1 利用双端队列实现单调队列 ---------------&#x1f388;&#x1f388;题目链接 Leetcode 239 滑动窗口最大值&#x1f388;&#x1f388;------------------- 双端队列的操作 创建双端队列&#xff1a;Deque<…

解决字符串类型转数字类型相加结果异常问题

js字符串类型转换数字类型有七种方法&#xff0c;分别是parseInt()&#xff0c;parseFloat()&#xff0c;Math.floor()&#xff0c;乘以数字&#xff08;*1&#xff09;&#xff0c;Number()&#xff0c;双波浪号 (~~number)&#xff0c;一元运算符&#xff08;number&#xff…

npm run dev 启动vue的时候指定端口

使用的是 Vue CLI 来创建和管理 Vue 项目&#xff0c; 可以通过设置 --port 参数来指定启动的端口号。以下是具体的步骤&#xff1a; 打开命令行终端 进入您的 Vue 项目目录 运行以下命令&#xff0c;通过 --port 参数指定端口号&#xff08;例如&#xff0c;这里设置端口号…

学习c语言,函数指针数组

上一个函数指针修改成函数数组

深入详解使用 RabbitMQ 过程中涉及到的多个细节问题(面试可用)

目录 1、基础类问题 2、cluster 相关问题 3、综合性问题 4、参考资料 C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/125529931C/C基础与进阶&…

三大3D引擎对比,直观感受AMRT3D渲染能力

作为当前热门的内容呈现形式&#xff0c;3D已经成为了广大开发者、设计师工作里不可或缺的一部分。 用户对于3D的热衷&#xff0c;源于其带来的【沉浸式体验】和【超仿真视觉效果】。借此我们从用户重点关注的四个3D视觉呈现内容&#xff1a; 材质- 呈现多元化内容水效果- 展…

Java开发的审批流系统,前端使用vue,支持常态化工作审批流程

一、项目形式 springbootvueactiviti集成了activiti在线编辑器&#xff0c;快速开发平台&#xff0c;可插拔工作流服务。 二、项目介绍 本项目拥有用户管理&#xff0c;部门管理&#xff0c;代码生成&#xff0c;系统监管&#xff0c;报表&#xff0c;大屏展示&#xff0c;业…

使用C语言实现模型的推理(一)

使用C语言实现模型的推理&#xff08;一&#xff09; WHY&#xff1f;思路整理从怎么把大象放到冰箱里开始怎么让模型推理跑起来 生成一个模型理清楚算子之间的依赖关系获取tensor信息获取依赖信息获取模型的运算图拓扑排序 TO DO其他biasDELEGATE WHY&#xff1f; 现在推理框…

2023预警名单

中国科学院文献情报中心期刊分区表-预警名单 2023年预警名单 2021年预警名单 官方没有2022年预警名单 2020年预警名单 每一年都有变化&#xff0c;今年在预警名单&#xff0c;明年可能就不在预警名单了&#xff0c;具体看学校要求&#xff0c;以及入学年份。

定义域【高数笔记】

【定义域】 1&#xff0c;{知识点} 对于一个函数&#xff0c;f(x)&#xff0c;"f"是起到两个作用&#xff0c;第一&#xff0c;是对自变量的范围的约束&#xff0c;第二&#xff0c;是对运算的约束&#xff0c;同一个"f" 就有同一个约束效果 2&#xff0c;…

离散数学学习要点——命题逻辑

文章目录 数理逻辑命题逻辑命题命题的种类命题的表示 逻辑连接词否定联结词合取联结词∧析取联结词∨或异或 条件➡等价&#xff08;双条件&#xff09;联结词↔联结词真值表 命题逻辑中的命题的符号化命题公式及其真值表命题公式真值表 命题公式的等价重言式与重言蕴含式重言式…

TypeScript依赖注入框架Typedi的使用、原理、源码解读

简介 typedi是一个基于TS的装饰器和reflect-metadata的依赖注入轻量级框架&#xff0c;使用简单易懂&#xff0c;方便拓展。 使用typedi的前提是安装reflect-metadata&#xff0c;并在项目的入口文件的第一行中声明import ‘reflect-metadata’&#xff0c;这样就会在原生的R…

大数据工作岗位需求分析

前言&#xff1a;随着大数据需求的增多&#xff0c;许多中小公司和团队也新增或扩展了大数据工作岗位&#xff1b;但是却对大数据要做什么和能做什么&#xff0c;没有深入的认识&#xff1b;往往是招了大数据岗位&#xff0c;搭建起基础能力后&#xff0c;就一直处于重复开发和…

分类预测 | Matlab实现ISSA-SVM基于多策略混合改进的麻雀搜索算法优化支持向量机的数据分类预测

分类预测 | Matlab实现ISSA-SVM基于多策略混合改进的麻雀搜索算法优化支持向量机的数据分类预测 目录 分类预测 | Matlab实现ISSA-SVM基于多策略混合改进的麻雀搜索算法优化支持向量机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 基于多策略混合改进的麻…

录课视频太大怎么办?3种方法一键瘦身~

录制视频是现代人常用的一种记录生活的方式&#xff0c;但是视频文件大小往往会很大&#xff0c;不利于存储和分享。为了解决这个问题&#xff0c;我们需要使用视频压缩软件来压缩视频文件大小&#xff0c;以便更方便地存储和分享。 方法一&#xff1a;嗨格式压缩大师 嗨格式压…

Lucas求大组合数C(n,m)%p

将大组合数C&#xff08;n,m&#xff09;%p分解为小组合数C&#xff08;n,m&#xff09;%p乘积的模&#xff0c;n<10^18,m<10^18。 其中求解小组合数可以根据定义式计算&#xff08;质因子分解&#xff09;&#xff0c;也可以通过定义式的变形计算&#xff08;逆元&…

如何使用Portainer部署web站点并实现无公网ip远程访问

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

【根据loss曲线看模型微调效果】如何使用loss曲线诊断机器学习模型性能

一、Loss曲线 在模型的预训练或者微调过程中&#xff0c;我们一般通过观察loss曲线来得出模型对于数据集的学习效果等信息。那么我们如何根据loss曲线得到一些信息呢&#xff1f; 通常数据集会被划分成三部分&#xff0c;训练集&#xff08;training dataset&#xff09;、验证…

Flask 项目怎么配置并创建第一个小项目?附上完成第一个小案例截图

目录 1. 为什么要学习 flask&#xff1f; 2. flask 是什么&#xff1f; 3. flask 如何使用&#xff1f; 要安装 Flask&#xff0c;可以按照以下步骤进行&#xff1a; 4. 使用流程 4.1. 新建项目 4.1.1. 打开 pycharm&#xff0c;新建项目 4.1.2. 设置目录&#xff0c;并…

解决系统开发中的跨域问题:CORS、JSONP、Nginx

文章目录 一、概述1.问题场景2.浏览器的同源策略3.解决思路 二、一点准备工作1.创建前端工程12.创建后端工程3.创建前端工程24.跨域问题 三、方法1&#xff1a;使用CORS四、方法2&#xff1a;JSONP五、方法3&#xff1a;Nginx1.安装和启动&#xff08;windows&#xff09;2.使用…
最新文章