数据库连接池(C3P0的简单使用)

C3P0:是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。

使用步骤

  1. 导入jar包: c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar、mysql-connector-java-5.1.48.jar

  2. 定于配置文件:可以命名为c3p0-config.xml

    复制
    <c3p0-config>
    <!-- 使用默认的配置读取连接池对象 -->
    <default-config>
    <!-- 连接参数 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/Study</property>
    <property name="user">登录数据库的用户</property>
    <property name="password">登录数据库的密码</property>
    <!-- 连接池参数 -->
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">10</property>
    <property name="checkoutTimeout">3000</property>
    </default-config>
    <named-config name="otherc3p0">
    <!-- 连接参数 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/Study</property>
    <property name="user">登录数据库的用户</property>
    <property name="password">登录数据库的密码</property>
    <!-- 连接池参数 -->
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">8</property>
    <property name="checkoutTimeout">1000</property>
    </named-config>
    </c3p0-config>
  3. 创建数据库连接池对象

    复制
    DataSource dataSource = new ComboPooledDataSource();
  4. 获取数据库连接对象

    复制
    Connection connection = dataSource.getConnection();

举例如下:

复制
package my.view.datasource.c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0Demo01 {
public static void main(String[] args) throws SQLException {
// 创建数据库连接池对象
DataSource dataSource = new ComboPooledDataSource();
// 获取一个连接对象
Connection connection = dataSource.getConnection();
// 打印获取的连接对象的地址值
System.out.println(connection);
}
}

配置文件说明

获取MySQL驱动

复制
<property name="driverClass">com.mysql.jdbc.Driver</property>

要连接的数据库地址

复制
<property name="jdbcUrl">jdbc:mysql://localhost:3306/Study</property>

登录数据库时的用户名

复制
<property name="user">登录数据库的用户</property>

登录数据库是用户名对应的密码

复制
<property name="password">登录数据库的密码</property>

初始化申请的数据库连接数量

复制
<property name="initialPoolSize">最小数量</property>

最大的数据库连接数量

复制
<property name="maxPoolSize">最大数量</property>

毫秒为单位的超时时间

复制
<property name="checkoutTimeout">超时时间</property>

默认配置

复制
<default-config>
.......
</default-config>

指定名称配置

复制
<named-config name="名称">
......
</named-config>

配置的使用

使用默认配置

复制
// 创建数据库连接池对象
DataSource dataSource = new ComboPooledDataSource();

使用指定名称配置

复制
// 创建数据库连接池对象
DataSource dataSource = new ComboPooledDataSource("名称");

举例

如c3p0-config.xml中的默认配置,最大数据库连接对象是10个。

获取10个数据库连接对象:

复制
package my.view.datasource.c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0Demo02 {
public static void main(String[] args) throws SQLException {
// 创建数据库连接池对象
DataSource dataSource = new ComboPooledDataSource();
for (int i = 0; i < 10; i++) {
// 获取一个连接对象
Connection connection = dataSource.getConnection();
// 打印获取的连接对象的地址值
System.out.println(i + " ———— " + connection);
}
}
}

运行程序,控制台输出连接池中获取的所有数据库连接对象的地址值:

复制
0 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@71e7a66b [wrapping: com.mysql.jdbc.JDBC4Connection@2ac1fdc4]
1 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@1c53fd30 [wrapping: com.mysql.jdbc.JDBC4Connection@50cbc42f]
2 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@282ba1e [wrapping: com.mysql.jdbc.JDBC4Connection@13b6d03]
5 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@326de728 [wrapping: com.mysql.jdbc.JDBC4Connection@25618e91]
6 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@71f2a7d5 [wrapping: com.mysql.jdbc.JDBC4Connection@2cfb4a64]
7 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@4b6995df [wrapping: com.mysql.jdbc.JDBC4Connection@2fc14f68]
8 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@66048bfd [wrapping: com.mysql.jdbc.JDBC4Connection@61443d8f]
9 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@61a52fbd [wrapping: com.mysql.jdbc.JDBC4Connection@233c0b17]

获取超过10个数据库连接对象,如获取11个数据库连接池对象,运行程序,会抛出异常:

复制
Exception in thread "main" java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.

获取第11个熟即可连接池对象的时候,超时(如上配置的超时时间为3秒钟)。那么该如何解决呢?很简单,我获取完一个数据连接池对象,就归还给数据库连接池即可,保证数据库连接池有数据库连接对象可以获取,操作如下:

复制
package my.view.datasource.c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0Demo03 {
public static void main(String[] args) throws SQLException {
// 创建数据库连接池对象
DataSource dataSource = new ComboPooledDataSource();
for (int i = 0; i < 11; i++) {
// 获取一个连接对象
Connection connection = dataSource.getConnection();
// 打印获取的连接对象的地址值
System.out.println(i + " ———— " + connection);
// 将获取到的数据库连接对象归还给数据库连接池
connection.close();
}
}
}
posted @   LeeHua  阅读(1454)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示

目录导航