JDBC连接池
C3P0数据库连接池
1. DBCP简介
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。如果需要使用该连接池实现,应在系统中添加如下一个jar文件:
- c3p0.jar:连接池的实现(比如:c3p0-0.9.1.2.jar)
2. 使用C3P0的步骤
1、 加入jar包:c3p0.jar;
2、 创建C3P0数据源:newComboPooledDataSource();;
3、 设置数据源必须的属性;
4、 从数据源获取连接;
3. 一个简易的测试范例
pom.xml
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
测试类
package com.tqazy.test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;
import java.sql.Connection;
public class TestC3p0 {
@Test
public void testC3p0() throws Exception {
// 1. 创建C3P0数据源
ComboPooledDataSource cpds = new ComboPooledDataSource();
// 2. 设置数据源必须的属性
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8");
cpds.setUser("root");
cpds.setPassword("admin123");
// 3. 从数据源获取连接
Connection connection = cpds.getConnection();
// 打印连接
System.out.println(connection.getClass());
}
}
结果
4. 读取配置文件创建数据源
我们是否可以像DBCP一样从文件中读取配置信息呢?
当然可以,C3P0是从xml中读取的配置文件,我们可以在resources资源文件夹下创建文件[c3p0-config.xml]文件,文件名不可变。
步骤:
1、 创建c3p0-config.xml文件;
2、 创建ComboPooledDataSource实例:DataSourcedataSource=newComboPooledDataSource("helloc3p0");
;
3、 从DataSource
实例中获取数据库连接;
下面是我的配置文件代码:
最上面的name="helloc3p0"
是表示这个配置块的名字为helloc3p0
。我们可以配置不同的配置快,然后在引用时选择。
上面的四个配置表示的是必须配置的属性,其他的可选配置的全部配置在第5小节可查询
<c3p0-config>
<named-config name="helloc3p0">
<!-- 指定连接数据源的基本属性 -->
<property name="driverClassName">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
<property name="user">root</property>
<property name="password">admin123</property>
<!-- 当C3P0数据源中的连接池耗尽时,一次同时获取的连接数 -->
<property name="acquireIncrement">3</property>
<!-- 初始化数据库连接池时连接的数量 -->
<property name="initialPoolSize">5</property>
<!-- 数据库连接池中的最小的数据库连接数 -->
<property name="minPoolSize">5</property>
<!-- 数据库连接池中的最大的数据库连接数 -->
<property name="maxPoolSize">13</property>
<!-- C3P0数据库连接池可以维护的Statement的个数 -->
<property name="maxStatements">20</property>
<!-- 每一个连接同时可以使用的Statement对象个数 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
测试方法
其实很简单,我们在正常创建C3P0实例时,选择重载方法,传入我们配置的配置块的名字,即可自动读取并使用
@Test
public void testC3p0WithConfigFile() throws SQLException {
// helloc3p0是配置文件里named-config的name的值
DataSource dataSource = new ComboPooledDataSource("helloc3p0");
System.out.println(dataSource.getConnection().getClass());
ComboPooledDataSource comboPooledDataSource = (ComboPooledDataSource) dataSource;
System.out.println(comboPooledDataSource.getAcquireIncrement());
System.out.println(comboPooledDataSource.getMaxPoolSize());
}
结果
5. C3P0属性说明
这里是图片,下面有表格(一模一样),可以复制Ctrl+F查询意思
表格:
属性名 | 注释 |
---|---|
acquireIncrement | 默认值为3,表示当C3P0数据源中的连接池耗尽时,一次同时获取的连接数。 |
acquireRetryAttempts | 默认值为30,表示从数据库中获取新连接失败后,重复尝试的次数。如果将其设置为0或者小于0的数值,则C3P0将一直进行尝试获取连接。 |
acquireRetryDelay | 默认值为1000,单位为毫秒,表示C3P0相邻两次获取连接的时间间隔。 |
autoCommitOnClose | 默认为false,表示在连接关闭时,将所有未提交的操作回滚。设置为true,则在连接关闭时,会将操作进行提交。 |
automaticTestTable | 默认为null,设置该属性后,C3P0会自动创建一张名为该属性值的空表,专门是C3P0用来测试使用者所获取的数据库连接,使用者是没法对该表进行操作的。同时该属性设置后,则忽略preferredTestQuery属性。 |
preferredTestQuery | 默认为null,表示所有连接测试都要执行的测试语句,这一属性的设置能够显著地提高测试速度。注意:该测试语句里的表必须在数据源初始化的时候就已经存在了。 |
breakAfterAcquireFailure | 默认为false,表示在获取数据库连接失败时,会引起所有等待连接池获取连接的线程抛出异常,但是数据源仍然保持有效,并且在下次调用getConnection时继续尝试获取连接。设置为true,表示在获取数据库连接失败时,重复尝试acquireRetryAttempts指定的次数,此时再失败,则声明数据源已经断开并且永久关闭。 |
driverClass | 默认为null,值为全类名,该类是提供数据库连接的JDBC驱动类。默认C3P0会去检测其是否为JDBC驱动程序的实例,如果想跳过这步验证,可设置forceUseNamedDriverClass属性。 |
forceUseNamedDriverClass | 默认为false,设置为true,表示强制指定driverClass属性指定的类为JDBC驱动程序的实例,而让C3P0不再做这一步检测。 |
dataSourceName | 默认为C3P0指定的标识符,表示数据源的名称,便于我们追踪和查找数据源。 |
jdbcUrl | 默认为null,表示数据库的JDBC URL,用来获取数据库连接。 |
user | 默认为null,表示使用数据源时需要的用户名。 |
password | 默认为null,表示使用数据源时需要的密码。 |
minPoolSize | 默认为3,表示连接池中任何时候可以存放的连接最小数量。 |
maxPoolSize | 默认为15,表示连接池中任何时候可以存放的连接最大数量。 |
initialPoolSize | 默认为3,表示初始化连接池时获取的连接个数。该数值在miniPoolSize和maxPoolSize之间。 |
testConnectionOnCheckin | 默认为false,设置为true,表示向连接池中放入连接时测试连接的有效性。 |
testConnectionOnCheckout | 默认为false,设置为true,表示从连接池中取出连接时测试连接的有效性,因为此操作会降低性能,建议使用idleConnectionTestPeriod或者automaticTestTable来提升连接测试的性能。 |
checkoutTimeout | 默认为0,单位为毫秒,表示当连接池中连接用完时,客户端调用getConnection获取连接等待的时间,如果超时,则抛出SQLException异常。特殊值0表示无限期等待。 |
connectionCustomizerClassName | 默认为null,值为全类名,该类必须实现ConnectionCustomizer接口,用来管理Connection的生命周期,例如获取连接时设置Connection的隔离级别,Connection丢弃的时候进行资源关闭等等。一般不配置该属性。 |
connectionTesterClassName | 默认为com.mchange.v2.c3p0.impl.DefaultConnectionTester,值为全类名,该类必须实现ConnectionTester或者QueryConnectionTester,用来测试数据库的连接。 |
debugUnreturnedConnectionStackTraces | 默认为false,只可在debug下设置该属性为true,因为该设置会降低从连接池中获取连接的性能。设置为true,并且UnreturnedConnectionTimeOut设置为非0自然数,则C3P0会追踪所有从连接池中取出的连接,对于超时未归还的,会打印追踪信息。该设置就是为了测试应用对数据库的连接是否忘记归还,从而导致从C3P0连接池中取出的连接越来越多,最终池中连接被耗尽。 |
extensions | 默认为空的Map,用来为C3P0设置自己的配置信息,一般是用来管理Connection生命周期(ConnectionCustomizer)的时候使用。 |
factoryClassLocation | 默认为null,指定C3P0.libraries的路径,如果本地可以获取,则该值设置为null。 |
forceIgnoreUnresolvedTransactions | 默认为false,强烈不推荐,设置为true,将导致出现奇怪的bug出现。 |
idleConnectionTestPeriod | 默认为0,单位为秒,设置为非0自然数,表示每隔指定秒去检测一次连接池中的空闲连接。 |
maxConnectionAge | 默认为0,单位为秒,表示连接超过该属性指定的时间,则被销毁掉,并且从连接池中移除,0则表示没有时间限制。 |
maxIdleTime | 默认为0,单位为秒,表示在连接池中未被使用的连接最长存活多久不被移除。 |
maxIdleTimeExcessConnections | 默认为0,单位为秒,表示在连接池中未被使用的、超出miniPoolSize的那些连接最长存活多久不被移除。 |
maxStatements | 默认为0,表示JDBC的标准参数,控制数据源内缓存的PreparedStatements数量。和maxStatementsPerConnection配合使用,如果二者都为0,则statement不进行缓存。如果该参数为0,而maxStatementsPerConnection为非零自然数,则表示每一个连接缓存的PreparedStatements数量。 |
maxStatementsPerConnection | 默认为0,表示每一个连接缓存的PreparedStatements数量。 |
本章结束
如果本文有错误或对本文有不理解的地方欢迎评论 ^_^
如果本文有帮助到您,可以点一下右上角的赞哦,谢谢啦