1. 概述

建立数据库连接是一个开销较大的操作。为了降低这个成本,连接池(Connection Pooling)已经成为一种成熟的解决方案。

本篇文章将介绍如何在 Hibernate 中集成并使用 c3p0 来管理数据库连接。

2. 什么是 c3p0?

c3p0 是一个用于管理数据库连接的 Java 库,它通过创建连接池来复用连接,从而提高性能。

它不仅能管理连接,还能自动清理使用后的 StatementResultSet 对象,避免资源泄露和死锁的发生。

此外,c3p0 兼容多种传统 JDBC 驱动,并提供适配层,将基于 DriverManager 的驱动转换为现代的 javax.sql.DataSource 接口。

由于 Hibernate 本身就是基于 JDBC 的 ORM 框架,所以 将 c3p0 与 Hibernate 结合使用非常简单

3. 在 Hibernate 中配置 c3p0

接下来我们来看看如何将现有的 Hibernate 项目配置为使用 c3p0 作为连接池管理器。

3.1. Maven 依赖配置

首先,我们需要添加 hibernate-c3p0 依赖:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-c3p0</artifactId>
    <version>5.3.6.Final</version>
</dependency>

⚠️ 注意: 在 Hibernate 5 中,只要没有配置其他连接池,仅添加上述依赖即可自动启用 c3p0。

添加依赖后,启动项目并查看日志:

Initializing c3p0-0.9.5.2 [built 08-December-2015 22:06:04 -0800; debug? true; trace: 10]
Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@34d0bdb9 [ ... default settings ... ]

如果项目中使用了其他连接池(如 HikariCP),可以通过显式配置强制使用 c3p0,在配置文件中添加:

hibernate.connection.provider_class=org.hibernate.connection.C3P0ConnectionProvider

3.2. 连接池参数配置

默认配置可能不满足实际需求,我们可以通过配置文件自定义连接池参数。

hibernate.cfg.xml 中配置:

<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.acquire_increment">5</property>
<property name="hibernate.c3p0.timeout">1800</property>

或者在 hibernate.properties 中配置:

hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.acquire_increment=5
hibernate.c3p0.timeout=1800

各项参数说明:

参数名 默认值 说明
min_size 3 连接池中维持的最小连接数,也即初始连接数
max_size 15 最大连接数
acquire_increment 3 当连接池耗尽时,一次性获取的新连接数
timeout 0(永不超时) 空闲连接在池中保留的秒数,超时将被回收

✅ 启动后可以通过日志验证配置是否生效:

Initializing c3p0-0.9.5.2 [built 08-December-2015 22:06:04 -0800; debug? true; trace: 10]
Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@b0ad7778 [ ... new settings ... ]

除了上述基本配置,更多高级参数可以参考 c3p0 官方文档

4. 小结

这篇文章我们介绍了如何在 Hibernate 中使用 c3p0 连接池,包括依赖引入、基本配置和关键参数说明。

在实际生产环境中,推荐使用像 c3p0 或 HikariCP 这样的连接池组件,而不是直接使用传统 JDBC 驱动。

📦 本文完整代码示例可从 GitHub 获取。


原始标题:Using c3p0 with Hibernate