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/*" # 排除静态资源
使用示例 :直接注入JdbcTemplate或DataSource即可使用(底层自动复用连接池):
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 |
总结
- 配置方式 :Spring Boot项目优先使用
druid-spring-boot-starter,通过application.yml配置;纯Java项目手动初始化DruidDataSource。 - 核心参数 :重点关注
maxActive(最大连接数)和testWhileIdle(空闲检测),平衡性能与连接可用性。 - 核心优势: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 # 数据库过滤器