贝利信息

mysql C3P0连接池配置方法_mysql旧项目常用方案

日期:2026-01-19 00:00 / 作者:P粉602998670
C3P0因稳定性和与旧框架兼容性仍在MySQL老项目中常见,配置需用c3p0-config.xml,必须显式指定serverTimezone、正确转义XML符号,并复用单例DataSource。

为什么 C3P0 在 MySQL 旧项目里还常见

C3P0 是 Java 早期最稳定的 JDBC 连接池之一,尤其在 Hibernate 3.x / Spring 2.x 时代被大量默认集成。它不依赖外部框架、配置项直白、异常堆栈清晰,适合维护型老项目——哪怕现在主流用 HikariCP,很多银行、政务系统仍跑着十年以上的 C3P0 + MySQL 5.1/5.5 组合。

c3p0-config.xml 中 MySQL 基础配置怎么写

必须用 c3p0-config.xml(不能叫别的名,且要放在 src/main/resources 下),否则 ComboPooledDataSource 找不到默认配置。MySQL 相关参数不能只填 jdbcUrl,否则连接会卡在握手阶段或报时区错误。



  
    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
    root
    123456

    5
    20
    5
    5
    0
    300
    30
  

Java 代码里怎么安全获取 Connection

别直接 new ComboPooledDataSource() —— 每次 new 都初始化一个新池子,导致连接数爆炸。必须复用单例实例,且注意捕获 SQLException 而非 Exception

public class DBUtil {
  private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
  
  public static Connection getConnection() throws SQLException {
    return dataSource.getConnection(); // 不要 catch,让上层决定重试 or rollback
  }
}

遇到 “Connections could not be acquired from the underlying database!” 怎么排查

这是 C3P0 最典型的报错,不是配置写错,而是底层连不上 MySQL。优先查这三处:

旧项目容易忽略 MySQL 的 wait_timeout(默认 28800 秒),C3P0 的 idleConnectionTestPeriod 必须小于它,否则空闲连接被 MySQL 主动断开后,C3P0 不知道,下次取出来就报错。