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防火墙规则,提高数据库安全性。

查看当前数据源的测试代码
java 复制代码
@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和数据库驱动的相关依赖:

XML 复制代码
<!-- 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连接池的相关参数:

java 复制代码
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依赖(根据自己配置参数按需引入)
XML 复制代码
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
绑定全局配置文件中的参数
java 复制代码
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,后台管理页面,如登录账号、密码等.

java 复制代码
 //配置 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过滤器
java 复制代码
//配置 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的日志依赖,方便我们在监控时获取日志信息。

XML 复制代码
<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进行配置

XML 复制代码
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连接池参数,结合监控页面,将会使应用的数据库性能达到事半功倍的效果。

相关推荐
XINGTECODE1 分钟前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
天天扭码7 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶7 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺12 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序19 分钟前
vue3 封装request请求
java·前端·typescript·vue
gma99928 分钟前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️31 分钟前
华为ASP与CSP是什么?
服务器·前端·数据库
凡人的AI工具箱34 分钟前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
陈王卜37 分钟前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、37 分钟前
Spring Boot 注解
java·spring boot