一、核心概念对比
特性 | Druid | C3P0 | DBCP |
---|---|---|---|
所属机构 | 阿里巴巴 | 开源社区 | Apache 基金会 |
监控能力 | 内置强大监控/统计功能 | 无原生监控 | 无原生监控 |
性能 | 高性能(生产级优化) | 中等 | 中等 |
扩展性 | 支持Filter链扩展 | 有限扩展 | 有限扩展 |
维护状态 | 持续更新 | 维护较少 | 维护较少 |
依赖 | 无强制依赖 | 依赖mchange-commons | 依赖commons-pool |
二、基础用法示例
1. Druid 连接池配置
druid.properties配置文件参考 下载jar包
java
driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC
username=root
password=you_pwd
# 初始化连接数量
initialSize=10
# 最大连接数量
maxActive=100
# 最大等待时间
maxWait=10
java
// 初始化配置
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("user");
dataSource.setPassword("pass");
dataSource.setInitialSize(5);
dataSource.setMaxActive(20);
dataSource.setFilters("stat,wall"); // 启用监控过滤器
// 获取连接
Connection conn = dataSource.getConnection();
基本使用
java
package com.lss.test;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class DruidTest {
public static void main(String[] args) throws Exception {
// 示例:使用Druid连接池创建数据库连接
// 1. 引入jar包:druid-1.1.19.jar
// 2. 读取配置文件:
Properties properties = new Properties();
InputStream inputStream = DruidTest.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(inputStream);
// 读取到配置放入 DataSource
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
// 获取连接
Connection conn = dataSource.getConnection();
// 3. 设定属性 如果配置了 druid.properties,则可以不用设置
// 获取预编译的Statement对象 查id=1的学生对象
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM user WHERE id = ?");
stmt.setInt(1, 1);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("name"));
}
// 5. 使用连接
System.out.println("Connected to the database");
conn.close();
assert inputStream != null;
inputStream.close();
}
}
2. C3P0 连接池配置
先下载jar包导入
官网下载链接 C3P0配置文件名称必须为
c3p0-config.xml
C3P0命名配置可以有多个
在项目的根目录下新建名为 c3p0.properties
的纯文本文档,并填入如下内容作为样例:
java
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/testdb
c3p0.user=root
c3p0.password=password
c3p0.minPoolSize=5
c3p0.maxPoolSize=20
c3p0.acquireIncrement=5
c3p0.idleConnectionTestPeriod=60
c3p0.maxIdleTime=1800
xml格式的配置文件
xml
<c3p0-config>
<!-- 定义默认的数据源配置 -->
<default-config>
<!-- JDBC驱动程序类名 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property> <!-- MySQL 的 JDBC 驱动 -->
<!-- 数据库 URL 地址 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC</property>
<!-- 数据库用户名 -->
<property name="user">root</property>
<!-- 数据库密码 -->
<property name="password">password</property>
<!-- 初始创建的数据库连接数 -->
<property name="initialPoolSize">5</property> <!-- 初始化时创建的连接数量 [^1]-->
<!-- 最大空闲时间,超过这个时间未使用的连接会被关闭 (单位:毫秒) -->
<property name="maxIdleTime">300</property> <!-- 超过 300 秒未被使用的连接将被销毁 -->
<!-- 最小空闲连接数 -->
<property name="minPoolSize">2</property> <!-- 至少保持两个空闲连接可用 [^1]-->
<!-- 最大活动连接数 -->
<property name="maxPoolSize">15</property> <!-- 同一时刻最多允许 15 个活跃连接 -->
<!-- 当连接耗尽时的最大等待时间(单位:毫秒),如果超时则抛出异常 -->
<property name="checkoutTimeout">3000</property> <!-- 如果没有可用连接,则线程会阻塞最长 3 秒钟 -->
<!-- 自动重新尝试获取连接的时间间隔(单位:毫秒) -->
<property name="acquireRetryDelay">1000</property> <!-- 每隔一秒重试一次 -->
<!-- 是否自动提交事务,默认为 true -->
<property name="autoCommitOnClose">false</property> <!-- 关闭连接时不自动提交事务 -->
<!-- 测试连接的有效性的 SQL 查询语句 -->
<property name="preferredTestQuery">SELECT 1;</property> <!-- 使用简单的查询验证连接有效性 -->
<!-- 在每次获得新连接之前是否测试其有效性 -->
<property name="testConnectionOnCheckout">true</property> <!-- 获取连接前进行测试 [^1]-->
<!-- 在返回到池中之前是否测试连接的有效性 -->
<property name="testConnectionOnCheckin">false</property> <!-- 返回连接时不进行额外测试 -->
</default-config>
<!-- 可选:定义命名数据源配置 -->
<named-config name="customDataSource">
<!-- 继承 default-config 中的部分设置 -->
<property name="overrideDefaultUser">custom_user</property>
<property name="overrideDefaultPassword">custom_password</property>
<property name="maxPoolSize">20</property> <!-- 增加最大连接数至 20 [^1]-->
</named-config>
</c3p0-config>
基础配置示例
java
package com.lss.test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class C3pool {
public static void main(String[] args) throws SQLException, PropertyVetoException {
// 示例:使用C3P0连接池创建数据库连接
// 1.导入jar包:c3p0-0.9.5.2.jar
// 2.创建DataSource对象
ComboPooledDataSource pool = new ComboPooledDataSource();
// 3. 设定属性 如果配置了 c3po-config.xml,则可以不用设置 默认读取src/c3p0-config.xml
pool.setDriverClass("com.mysql.jdbc.Driver");
pool.setJdbcUrl("jdbc:mysql://localhost:3306/test");
pool.setUser("root");
pool.setPassword("you_pwd");
// 4. 获取连接
Connection conn = pool.getConnection();
// 获取预编译的Statement对象 查id=1的学生对象 防sql注入
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM user WHERE id = ?");
stmt.setInt(1, 1);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("name"));
}
// 5. 使用连接
System.out.println("Connected to the database");
conn.close();
// 6. 关闭连接池
pool.close();
}
}
3. DBCP 连接池配置
java
BasicDataSource bds = new BasicDataSource();
bds.setUrl("jdbc:mysql://localhost/db");
bds.setUsername("user");
bds.setPassword("pass");
bds.setInitialSize(5);
bds.setMaxTotal(20); // 注意参数名差异
Connection conn = bds.getConnection();
三、高级封装策略
1. Druid 监控集成方案
java
// 启用Web监控(需配置WebStatFilter)
@WebServlet("/druid/*")
public class DruidStatViewServlet extends StatViewServlet {}
// 启用Spring监控
@Bean
public ServletRegistrationBean<StatViewServlet> druidServlet() {
return new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
}
2. 通用连接池工厂模式
java
public class ConnectionFactory {
private static volatile DataSource dataSource;
public static DataSource getDataSource() {
if (dataSource == null) {
synchronized (ConnectionFactory.class) {
// 根据配置选择实现类
if ("druid".equals(config.type)) {
dataSource = initDruidDataSource();
}
// 其他实现...
}
}
return dataSource;
}
}
四、关键差异总结
对比维度 | Druid | C3P0 | DBCP |
---|---|---|---|
SQL防注入 | ✅ 内置WallFilter | ❌ | ❌ |
连接泄漏检测 | ✅ 精确到方法栈 | ❌ | ⚠️ 基础检测 |
异步初始化 | ✅ 支持 | ❌ | ❌ |
分布式支持 | ✅ 通过Druid-Admin | ❌ | ❌ |
五、选型建议
- 新项目首选:Druid(监控+高性能)
- 旧系统维护:根据现有技术栈选择
- 监控需求:强制推荐Druid
- 轻量级场景:HikariCP(需知晓)
最佳实践提示:生产环境必须配置连接池监控,Druid的SQL防火墙功能可有效预防慢查询和注入攻击