【12】C3P0连接池技术的实现

本文主要介绍了C3P0连接池相关内容。对比了c3p0与dbcp的区别,如c3p0有自动回收空闲连接功能,dbcp提供最大连接数等。还讲述了C3P0连接池jar文件导入,以及使用类和配置文件实现C3P0连接池的方法,最后提及C3P0详细配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


C3P0:C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
dbcp:DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。

1. c3p0与dbcp区别

  • dbcp没有自动回收空闲连接的功能
  • c3p0有自动回收空闲连接功能

两者主要是对数据连接的处理不同:c3p0提供最大空闲时间,dbcp提供最大连接数。
dbcp是如果连接时间超过最大连接时间,就会断开当前连接。
dbcp如果超过最大连接数,就会断开所有连接。

2. C3P0连接池jar文件导入

  • c3p0-0.9.5.2.jar
  • mchange-commons-java-0.2.11.jar

maven

<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
</dependency>

3. 使用类实现C3P0连接池

//创建连接池对象
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//对池进行四大参数配置
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUser("root");
dataSource.setPassword("root");
		
//池配置
//配置初始化连接
dataSource.setInitialPoolSize(20);
//配置增量
dataSource.setAcquireIncrement(5);
//配置最小连接数
dataSource.setMinPoolSize(3);
//配置最大连接数
dataSource.setMaxPoolSize(50);
		
//获取数据库连接
Connection conn = dataSource.getConnection();
//关闭连接,其实是把连接归还给池
conn.close();

4.使用配置文件实现C3P0连接池

使用配置文件实现C3P0的要求:

  • 文件名称必须为c3p0-config.xml
  • 文件位置必须在src下

4.1 默认配置

  • c3p0-config.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<!-- 默认配置 -->
	<default-config>
		<!-- 连接四大参数配置 -->
		<![CDATA[jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=UTF-8]]>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="user">root</property>
		<property name="password">root</property>
		<!-- 池参数配置 -->
		<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。默认值: 3 --> 
		<property name="acquireIncrement">3</property>
		<property name="initialPoolSize">10</property>
		<property name="minPoolSize">2</property>
		<property name="maxPoolSize">10</property>
	</default-config>
</c3p0-config>
  • 直接在java代码中创建数据连接池对象
//创建连接池对象
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//获取数据库连接
Connection conn = dataSource.getConnection();

4.2 使用命名配置

  • c3p0-config.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- Oracle配置信息 -->
	<named-config name="oracle-config">
		<![CDATA[jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=UTF-8]]>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="user">root</property>
		<property name="password">root</property>
		<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。默认值: 3 --> 
		<property name="acquireIncrement">3</property>
		<property name="initialPoolSize">10</property>
		<property name="minPoolSize">2</property>
		<property name="maxPoolSize">10</property>
	</named-config>
</c3p0-config>
  • 在java代码中创建池对象
//构造器的参数为指定命名配置元素的名称
ComboPooledDataSource dataSource = 
new ComboPooledDataSource("oracle-config");
//获取数据库连接
Connection conn = dataSource.getConnection();

5.C3P0详细配置

<property name="driverClass" value="${c3p0.driverClass}"></property>  
<property name="jdbcUrl" value="${c3p0.url}"></property>  
<property name="user" value="${c3p0.user}"></property>  
<property name="password" value="${c3p0.password}"></property>
<property name="testConnectionOnCheckout" value="true" />
<property name="unreturnedConnectionTimeout" value="300" />
<property name="debugUnreturnedConnectionStackTraces" value="true" />
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。默认值: 3 --> 
<property name="acquireIncrement" value="${c3p0.acquireIncrement}" />
<!-- 初始化连接池中的连接数,取值应在minPoolSize与maxPoolSize之间,默认为3-->
<property name="initialPoolSize" value="${c3p0.initialPoolSize}" /> 
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。默认值: 0 --> 
<property name="maxIdleTime" value="${c3p0.maxIdleTime}" />
<!--连接池中保留的最大连接数。默认值: 15 --> 
<property name="maxPoolSize" value="${c3p0.maxPoolSize}" /> 
<!-- 连接池中保留的最小连接数,默认为:3-->
<property name="minPoolSize" value="${c3p0.minPoolSize}" />
<!-- 当连接池连接耗尽时,客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。默认: 0 --> 
<property name="checkoutTimeout" value="3000" />
<!--重新尝试的时间间隔,默认为:1000毫秒--> 
<property name="acquireRetryDelay" value="1000" />
<!--定义在从数据库获取新连接失败后重复尝试的次数。默认值: 30 ;小于等于0表示无限次--> 
<property name="acquireRetryAttempts" value="60" />  
<!--关闭连接时,是否提交未提交的事务,默认为false,即关闭连接,回滚未提交的事务 --> 
<property name="autoCommitOnClose" value="false" />     
<!--如果为false,则获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常,但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。默认: false--> 
<property name="breakAfterAcquireFailure" value="false" />
<!--每60秒检查所有连接池中的空闲连接。默认值: 0,不检查 --> 
<property name="idleConnectionTestPeriod" value="60" />
<!--c3p0全局的PreparedStatements缓存的大小。如果maxStatements与maxStatementsPerConnection均为0,则缓存不生效,只要有一个不为0,则语句的缓存就能生效。如果默认值: 0--> 
<property name="maxStatements" value="100" />
<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。默认值: 0 --> 
<property name="maxStatementsPerConnection" value="0" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值