Springboot - druid 连接池

Druid连接池

核心需求确认

阿里巴巴Druid数据库连接池的使用方法,包括环境搭建、核心配置、实际调用,以及Druid特有的监控功能启用方式。

Druid连接池使用详解

Druid是阿里巴巴开源的高性能数据库连接池,相比Spring Boot默认的HikariCP,它额外提供了SQL监控、慢SQL统计、SQL防注入、连接池监控等生产级功能,是企业开发中最常用的连接池之一。

一、环境准备(Maven依赖)

根据项目类型引入对应依赖,推荐使用最新稳定版:

1. Spring Boot项目(最常用)
xml 复制代码
<!-- Druid Spring Boot Starter(自动配置,简化开发) -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.20</version>
</dependency>
<!-- MySQL驱动(根据数据库类型替换,如Oracle、PostgreSQL) -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
    <scope>runtime</scope>
</dependency>
2. 纯Java项目(无框架)
xml 复制代码
<!-- Druid核心包 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.20</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>
二、核心配置与使用
场景1:Spring Boot项目(推荐)

通过application.yml配置连接池和数据库信息,Spring Boot会自动初始化DataSource

yaml 复制代码
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      # 1. 数据库基础连接信息
      url: jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
      username: root       # 你的数据库账号
      password: 123456     # 你的数据库密码
      driver-class-name: com.mysql.cj.jdbc.Driver

      # 2. 连接池核心参数(关键)
      initial-size: 5        # 初始化连接数
      max-active: 20         # 最大活跃连接数(避免过大导致数据库压力)
      min-idle: 5            # 最小空闲连接数
      max-wait: 60000        # 获取连接的最大等待时间(毫秒)
      time-between-eviction-runs-millis: 60000  # 检测空闲连接的间隔
      min-evictable-idle-time-millis: 300000    # 空闲连接存活最小时间

      # 3. 连接有效性检测(保证连接可用)
      validation-query: SELECT 1 FROM DUAL     # 检测连接的SQL(不同数据库略有差异)
      test-while-idle: true                    # 空闲时检测(推荐开启)
      test-on-borrow: false                    # 获取连接时不检测(提升性能)
      test-on-return: false                    # 归还连接时不检测

      # 4. 监控与安全配置(Druid特色)
      filters: stat,wall,log4j2  # stat=监控统计;wall=SQL防注入;log4j2=日志
      # 监控页面配置
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*    # 监控页面访问路径
        login-username: admin    # 监控页面登录账号
        login-password: admin123 # 监控页面登录密码
        reset-enable: false      # 禁止重置监控数据
      # Web请求监控
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.css,/druid/*" # 排除静态资源

使用示例 :直接注入JdbcTemplateDataSource即可使用(底层自动复用连接池):

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DruidTestController {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @GetMapping("/test-druid")
    public String test() {
        // 执行SQL,测试连接池
        String now = jdbcTemplate.queryForObject("SELECT NOW()", String.class);
        return "Druid连接池测试成功,当前时间:" + now;
    }
}

访问监控面板

启动项目后,访问 http://localhost:8080/druid,输入配置的账号(admin)/密码(admin123),即可查看:

  • 数据源监控:连接池的活跃数、空闲数、等待数等
  • SQL监控:所有执行过的SQL、执行时间、行数
  • SQL防火墙:拦截的恶意SQL(如delete * from table)
场景2:纯Java项目(手动配置)

手动初始化DruidDataSource,适合无框架的简单项目:

java 复制代码
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DruidManualDemo {
    // 全局连接池对象(单例)
    private static DruidDataSource dataSource;

    // 初始化连接池(静态代码块,仅执行一次)
    static {
        dataSource = new DruidDataSource();
        // 数据库连接信息
        dataSource.setUrl("jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        
        // 连接池参数
        dataSource.setInitialSize(5);
        dataSource.setMaxActive(20);
        dataSource.setMinIdle(5);
        dataSource.setMaxWait(60000);
        dataSource.setTestWhileIdle(true);
        dataSource.setValidationQuery("SELECT 1 FROM DUAL");
    }

    // 获取连接(从连接池复用,非新建)
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    // 关闭资源(归还连接到池,非真正关闭)
    public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
        try {
            if (rs != null) rs.close();
            if (ps != null) ps.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 测试
    public static void main(String[] args) {
        try (Connection conn = getConnection();
             PreparedStatement ps = conn.prepareStatement("SELECT NOW()")) {
            
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                System.out.println("连接成功,当前时间:" + rs.getString(1));
            }
            close(conn, ps, rs);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
核心参数说明(新手必看)
参数名 作用 推荐值
initialSize 初始化连接数 5-10
maxActive 最大活跃连接数(核心) 20-50
minIdle 最小空闲连接数 与initialSize一致
maxWait 获取连接的最大等待时间(超时抛异常) 60000ms
testWhileIdle 空闲时检测连接有效性(避免无效连接) true
testOnBorrow 获取连接时检测(开启会降低性能) false

总结

  1. 配置方式 :Spring Boot项目优先使用druid-spring-boot-starter,通过application.yml配置;纯Java项目手动初始化DruidDataSource
  2. 核心参数 :重点关注maxActive(最大连接数)和testWhileIdle(空闲检测),平衡性能与连接可用性。
  3. 核心优势:Druid的监控面板是核心亮点,能直观查看连接池状态和SQL执行情况,便于生产环境排查问题。

配置druid内置监控页面

配置: 生产主机需设置白名单或关闭

复制代码
statViewServlet:
    enabled: true
    # 设置白名单,不填则允许所有访问
    allow:
    url-pattern: /druid/*
    # 控制台管理用户名和密码
    login-username: 
    login-password: 

druid监控页面地址

http://127.0.0.1:项目端口/druid/sql.html

用户名和密码

login-username:

login-password:

数据库密码加密

yml配置

复制代码
jasypt:
  encryptor:
    password: U3buwRJdQ2023
    algorithm: PBEWithMD5AndDES
# 数据源配置
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
                url: yourUrl
                username: yourUsername
                password: AfTgQgleg==
                connectionProperties: config.decrypt=true;config.decrypt.key=MFwwDEEAAQ== 
            # 数据库过滤器
            filter:
                config:
                enabled: true   

password:为你加密后的密码

connectionProperties: config.decrypt=true;config.decrypt.key=你生成的公钥

生成数据

方法一
java 复制代码
public class DruidEncryptorUtils {
	public static void main(String[] args) {
		try {
		    String password = "yourPassword";
		    String[] arr = ConfigTools.genKeyPair(512);
		    
		   // System.out.println("privateKey:" + arr[0]);
		    System.out.println("publicKey:" + arr[1]);
		    System.out.println("password:" + ConfigTools.encrypt(arr[0], password));
		} catch (Exception e) {
		    e.printStackTrace();
		}
		
		
	}
}
方法二

java -cp druid-1.1.22.jar com.alibaba.druid.filter.config.ConfigTools 你的密码

复制代码
# 加密方法
# java -cp druid-1.1.22.jar com.alibaba.druid.filter.config.ConfigTools ${youPassword}
# connectionProperties: config.decrypt=true;config.decrypt.key=${publicKey}
# password: ${password}

完整配置

复制代码
# 数据源配置
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
                url: ***
                username: root
                password: ***
                connectionProperties: config.decrypt=true;config.decrypt.key=***
            # 从库数据源
            slave:
                # 从数据源开关/默认关闭
                enabled: false
                url: 
                username: 
                password: 
            # 初始连接数
            initialSize: 5
            # 最小连接池数量
            minIdle: 10
            # 最大连接池数量
            maxActive: 20
            # 配置获取连接等待超时的时间
            maxWait: 60000
            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            timeBetweenEvictionRunsMillis: 60000
            # 配置一个连接在池中最小生存的时间,单位是毫秒
            minEvictableIdleTimeMillis: 300000
            # 配置一个连接在池中最大生存的时间,单位是毫秒
            maxEvictableIdleTimeMillis: 900000
            # 配置检测连接是否有效
            validationQuery: SELECT 1 FROM DUAL
            testWhileIdle: true
            testOnBorrow: false
            testOnReturn: false
            webStatFilter: 
                enabled: true
                # 添加过滤规则
                url-pattern: /*
                # 忽略过滤格式
                exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
            statViewServlet:
                enabled: true
                loginUsername: druid
                loginPassword: druid123
                # 设置白名单,不填则允许所有访问
                allow:
                url-pattern: /druid/*
            filter:
                stat:
                    enabled: true
                    # 慢SQL记录
                    log-slow-sql: true
                    slow-sql-millis: 1000
                    merge-sql: true
                wall:
                    config:
                        multi-statement-allow: true
                config:
                    enabled: true   # 数据库过滤器

相关推荐
JaguarJack2 小时前
“Fatal error: require(): Failed opening required...” 以及如何彻底避免它再次出现
后端·php·服务端
MX_93592 小时前
Spring基本配置和注入配置注解使用
java·后端·spring
蓝天星空2 小时前
企业总线、注册中心、网关三者的区别
后端·架构
数新网络2 小时前
赋能某跨境智慧物流:基于 AWS Graviton 的全栈数据平台实现 25% 成本节省
java·云计算·aws
C雨后彩虹2 小时前
ThreadLocal全面总结,从理论到实践再到面试高频题
java·面试·多线程·同步·异步·threadlocal
UIUV2 小时前
语义化搜索学习笔记(结合代码实战)
javascript·后端·node.js
至此流年莫相忘2 小时前
Kubernetes核心概念
java·容器·kubernetes
大鹏说大话2 小时前
深入理解 Go 中的 make(chan chan error):高阶通道的典型用法与实战场景
开发语言·后端·golang
予枫的编程笔记2 小时前
【Docker进阶篇】从入门到精通:Java应用Docker打包,最佳实践与多阶段构建详解
java·docker·容器化·dockerfile·多阶段构建·docker最佳实践·java镜像优化