数据库连接池c3p0配置_动力节点Java学院整理
发布时间 - 2026-01-11 02:40:36 点击率:次c3p0的配置方式分为三种,分别是

1.setters一个个地设置各个配置项
2.类路径下提供一个c3p0.properties文件
3.类路径下提供一个c3p0-config.xml文件
1.setters一个个地设置各个配置项
这种方式最繁琐,形式一般是这样:
Properties props = new Properties();
InputStream in = ConnectionManager.class.getResourceAsStream("/c3p0.properties");
props.load(in);
in.close();
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass(props.getProperty("driverClass"));
cpds.setJdbcUrl(props.getProperty("jdbcUrl"));
cpds.setUser(props.getProperty("user"));
cpds.setPassword(props.getProperty("password"));
因为繁琐,所以很不适合采用,于是文档提供了另外另种方式。
2. 类路径下提供一个c3p0.properties文件
文件的命名必须是c3p0.properties,里面配置项的格式为:
c3p0.driverClass=com.mysql.jdbc.Driver c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc c3p0.user=root c3p0.password=java
上面只提供了最基本的配置项,其他配置项参照 文档配置,记得是c3p0.后面加属性名就是了,最后初始化数据源的方式就是这样简单:
private static ComboPooledDataSource ds = new ComboPooledDataSource();
public static Connection getConnection() {
try {
return ds.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
3.类路径下提供一个c3p0-config.xml文件
这种方式使用方式与第二种差不多,但是有更多的优点
(1).更直观明显,很类似hibernate和spring的配置
(2).可以为多个数据源服务,提供default-config和named-config两种配置方式
下面是一个配置模板:
<c3p0-config> <default-config> <property name="user">root</property> <property name="password">java</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> </default-config> <named-config name="myApp"> <property name="user">root</property> <property name="password">java</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> </named-config> </c3p0-config>
如果要使用default-config则初始化数据源的方式与第二种一样,如果要使用named-config里面配置初始化数据源,则只要使用一个带参数的ComboPooledDataSource构造器就可以了
private static ComboPooledDataSource ds = new ComboPooledDataSource("myApp");
下面整理一下从文档和网上学习到的c3p0配置的理解 (user,password,driverClass,jdbcUrl没有说的必要)
1.基本配置项
acquireIncrement
default : 3
连接池在无空闲连接可用时一次性创建的新数据库连接数
initialPoolSize
default : 3
连接池初始化时创建的连接数
maxPoolSize
default : 15
连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待
其他连接释放,所以这个值有可能会设计地很大
maxIdleTime
default : 0 单位 s
连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接
如果为0,则永远不会断开连接
minPoolSize
default : 3
连接池保持的最小连接数,后面的maxIdleTimeExcessConnections跟这个配合使用来减轻连接池的负载
2.管理连接池的大小和连接的生存时间
maxConnectionAge
default : 0 单位 s
配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待
它close再断开。配置为0的时候则不会对连接的生存时间进行限制。
maxIdleTimeExcessConnections
default : 0 单位 s
这个配置主要是为了减轻连接池的负载,比如连接池中连接数因为某次数据访问高峰导致创建了很多数据连接
但是后面的时间段需要的数据库连接数很少,则此时连接池完全没有必要维护那么多的连接,所以有必要将
断开丢弃掉一些连接来减轻负载,必须小于maxIdleTime。配置不为0,则会将连接池中的连接数量保持到minPoolSize。
为0则不处理。
maxIdleTime也可以归属到这一类,前面已经写出来了。
3.配置连接测试:因为连接池中的数据库连接很有可能是维持数小时的连接,很有可能因为数据库服务器的问题,网络问题等导致实际连接已经无效,但是连接池里面的连接还是有效的,如果此时获得连接肯定会发生异常,所以有必要通过测试连接来确认连接的有效性。
下面的前三项用来配置如何对连接进行测试,后三项配置对连接进行测试的时机。
automaticTestTable
default : null
用来配置测试连接的一种方式。配置一个表名,连接池根据这个表名创建一个空表,
并且用自己的测试sql语句在这个空表上测试数据库连接
这个表只能由c3p0来使用,用户不能操作,同时用户配置的preferredTestQuery 将会被忽略。
preferredTestQuery
default : null
用来配置测试连接的另一种方式。与上面的automaticTestTable二者只能选一。
如果要用它测试连接,千万不要设为null,否则测试过程会很耗时,同时要保证sql语句中的表在数据库中一定存在。
connectionTesterClassName
default : com.mchange.v2.c3p0.impl.DefaultConnectionTester
连接池用来支持automaticTestTable和preferredTestQuery测试的类,必须是全类名,就像默认的那样,
可以通过实现UnifiedConnectionTester接口或者继承AbstractConnectionTester来定制自己的测试方法
idleConnectionTestPeriod
default : 0
用来配置测试空闲连接的间隔时间。测试方式还是上面的两种之一,可以用来解决MySQL8小时断开连接的问题。因为它
保证连接池会每隔一定时间对空闲连接进行一次测试,从而保证有效的空闲连接能每隔一定时间访问一次数据库,将于MySQL
8小时无会话的状态打破。为0则不测试。
testConnectionOnCheckin
default : false
如果为true,则在close的时候测试连接的有效性。为了提高测试性能,可以与idleConnectionTestPeriod搭配使用,
配置preferredTestQuery或automaticTestTable也可以加快测试速度。
testConnectionOnCheckout
default : false
性能消耗大。如果为true,在每次getConnection的时候都会测试,为了提高性能,
可以与idleConnectionTestPeriod搭配使用,
配置preferredTestQuery或automaticTestTable也可以加快测试速度。
4.配置PreparedStatement缓存
maxStatements
default : 0
连接池为数据源缓存的PreparedStatement的总数。由于PreparedStatement属于单个Connection,所以
这个数量应该根据应用中平均连接数乘以每个连接的平均PreparedStatement来计算。为0的时候不缓存,
同时maxStatementsPerConnection的配置无效。
maxStatementsPerConnection
default : 0
连接池为数据源单个Connection缓存的PreparedStatement数,这个配置比maxStatements更有意义,因为
它缓存的服务对象是单个数据连接,如果设置的好,肯定是可以提高性能的。为0的时候不缓存。
5.重连相关配置
acquireRetryAttempts
default : 30
连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功
acquireRetryDelay
default : 1000 单位ms
连接池在获得新连接时的间隔时间
breakAfterAcquireFailure
default : false
如果为true,则当连接获取失败时自动关闭数据源,除非重新启动应用程序。所以一般不用。
个人觉得上述三个没有更改的必要,但可以将acquireRetryDelay配置地更短一些
6.定制管理Connection的生命周期
connectionCustomizerClassName
default : null
用来定制Connection的管理,比如在Connection acquire 的时候设定Connection的隔离级别,或者在
Connection丢弃的时候进行资源关闭,就可以通过继承一个AbstractConnectionCustomizer来实现相关
方法,配置的时候使用全类名。有点类似监听器的作用。
例如:
import java.sql.Connection;
import com.mchange.v2.c3p0.AbstractConnectionCustomizer;
public class ConnectionCustomizer extends AbstractConnectionCustomizer{
@Override
public void onAcquire(Connection c, String parentDataSourceIdentityToken)
throws Exception {
System.out.println("acquire : " + c);
}
@Override
public void onCheckIn(Connection c, String parentDataSourceIdentityToken)
throws Exception {
System.out.println("checkin : " + c);
}
@Override
public void onCheckOut(Connection c, String parentDataSourceIdentityToken)
throws Exception {
System.out.println("checkout : " + c);
}
@Override
public void onDestroy(Connection c, String parentDataSourceIdentityToken)
throws Exception {
System.out.println("destroy : " + c);
}
}
<property name="connectionCustomizerClassName">liuyun.zhuge.db.ConnectionCustomizer</property>
7.配置未提交的事务处理
autoCommitOnClose
default : false
连接池在回收数据库连接时是否自动提交事务
如果为false,则会回滚未提交的事务
如果为true,则会自动提交事务
forceIgnoreUnresolvedTransactions
default : false
这个配置强烈不建议为true。
一般来说事务当然由自己关闭了,为什么要让连接池来处理这种不细心问题呢?
8.配置debug和回收Connection 一般来说事务当然由自己关闭了,为什么要让连接池来处理这种不细心问题呢?
unreturnedConnectionTimeout
default : 0 单位 s
为0的时候要求所有的Connection在应用程序中必须关闭。如果不为0,则强制在设定的时间到达后回收
Connection,所以必须小心设置,保证在回收之前所有数据库操作都能够完成。这种限制减少Connection未关闭
情况的不是很适用。为0不对connection进行回收,即使它并没有关闭。
debugUnreturnedConnectionStackTraces
default : false
如果为true并且unreturnedConnectionTimeout设为大于0的值,当所有被getConnection出去的连接
unreturnedConnectionTimeout时间到的时候,就会打印出堆栈信息。只能在debug模式下适用,因为
打印堆栈信息会减慢getConnection的速度
同第七项一样的,连接用完当然得close了,不要通过unreturnedConnectionTimeout让连接池来回收未关闭的连接。
9.其他配置项:因为有些配置项几乎没有自己配置的必要,使用默认值就好,所以没有再写出来
checkoutTimeout
default : 0
配置当连接池所有连接用完时应用程序getConnection的等待时间。为0则无限等待直至有其他连接释放
或者创建新的连接,不为0则当时间到的时候如果仍没有获得连接,则会抛出SQLException
三、示例:
示例采用第二种方式:
1.c3p0.properties:
#驱动 c3p0.driverClass=com.mysql.jdbc.Driver #地址 c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc #用户名 c3p0.user=root #密码 c3p0.password=lovejava #------------------------------- #连接池初始化时创建的连接数 c3p0.initialPoolSize=3 #连接池保持的最小连接数 c3p0.minPoolSize=3 #连接池在无空闲连接可用时一次性创建的新数据库连接数,default:3 c3p0.acquireIncrement=3 #连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大,default : 15 c3p0.maxPoolSize=15 #连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接,单位秒 c3p0.maxIdleTime=100 #连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功 c3p0.acquireRetryAttempts=30 #连接池在获得新连接时的间隔时间 c3p0.acquireRetryDelay=1000
2.ConnectionPool
package com.study.pool;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class ConnectionPool {
private DataSource ds;
private static ConnectionPool pool;
private ConnectionPool(){
ds = new ComboPooledDataSource();
}
public static final ConnectionPool getInstance(){
if(pool==null){
try{
pool = new ConnectionPool();
}catch (Exception e) {
e.printStackTrace();
}
}
return pool;
}
public synchronized final Connection getConnection() {
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
3.PoolThread
package com.study.pool;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class PoolThread extends Thread {
@Override
public void run(){
ConnectionPool pool = ConnectionPool.getInstance();
Connection con = null;
PreparedStatement stmt= null;
ResultSet rs = null;
try{
con = pool.getConnection();
stmt = con.prepareStatement("select sysdate as nowtime from dual");
rs = stmt.executeQuery();
while(rs.next()){
System.out.println(Thread.currentThread().getId()+"---------------开始"+rs.getString("nowtime"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
rs.close();
stmt.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getId()+"--------结束");
}
}
4.PoolMain
package com.study.pool;
public class PoolMain {
/**
* 数据源缓冲池 实例练习
*/
public static void main(String[] args) {
System.out.println("缓冲池模拟开始");
PoolThread[] threads = new PoolThread[50];
for(int i=0;i<threads.length;i++){
threads[i] = new PoolThread();
}
for(int i=0;i<threads.length;i++){
threads[i].start();
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# c3p0
# 数据库连接池
# Java 数据库连接池c3p0 介绍
# Java数据库连接池c3p0过程解析
# Java使用C3P0数据源链接数据库
# Java数据库连接池之c3p0简介_动力节点Java学院整理
# 浅谈Java安全之C3P0的使用
# 连接池
# 连接数
# 则会
# 池中
# 提供一个
# 重试
# 自己的
# 不为
# 第二种
# 还没有
# 两种
# 设为
# 有必要
# 要让
# 文档
# 会再
# 三项
# 每隔
# 很有可能
# 用完
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
北京专业网站制作设计师招聘,北京白云观官方网站?
javascript基本数据类型及类型检测常用方法小结
移动端脚本框架Hammer.js
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
焦点电影公司作品,电影焦点结局是什么?
如何在搬瓦工VPS快速搭建网站?
iOS验证手机号的正则表达式
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Laravel怎么上传文件_Laravel图片上传及存储配置
米侠浏览器网页背景异常怎么办 米侠显示修复
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
利用 Google AI 进行 YouTube 视频 SEO 描述优化
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
实例解析angularjs的filter过滤器
PHP 500报错的快速解决方法
javascript中闭包概念与用法深入理解
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
香港服务器选型指南:免备案配置与高效建站方案解析
重庆市网站制作公司,重庆招聘网站哪个好?
长沙做网站要多少钱,长沙国安网络怎么样?
网站制作软件有哪些,制图软件有哪些?
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
android nfc常用标签读取总结
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
青岛网站建设如何选择本地服务器?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
如何用好域名打造高点击率的自主建站?
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
Laravel集合Collection怎么用_Laravel集合常用函数详解
使用豆包 AI 辅助进行简单网页 HTML 结构设计
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
怎样使用JSON进行数据交换_它有什么限制
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
lovemo网页版地址 lovemo官网手机登录
手机软键盘弹出时影响布局的解决方法
,交易猫的商品怎么发布到网站上去?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
简单实现Android验证码
如何用AWS免费套餐快速搭建高效网站?
Laravel如何实现API资源集合?(Resource Collection教程)

