DBCP连接池和C3P0连接池
由于建立数据库连接是一个非常耗时耗资源的行为,所以连接池的功能主要是系统初始运行时,主动建立足够的连接,组成一个池,用池来管理连接Connection。每次应用程序请求数据库连接时,无需重新打开连接,而是从池中取出已有的连接,使用完后,不再关闭,而是把连接归还池,这样就可以重用这个连接了。
常用的连接池有两种:DBCP连接池和C3P0连接池。
1,DBCP连接池
1.1,所需jar包
1.2,dbcpconfig.properties文件的基本配置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/dbutils_test
username=root
password=1234
注意:url中的”dbutils_test”是数据库的名字,也就是要连接到哪个数据库。
Properties类用于读取properties文件,所以该配置文件的后缀要为”.properties”,
使用该类可以以类似Map的形式读取配置文件中的内容,Properties文件中的内容格式类似:username=root,等号左边就是key,等号右边就是value。
dbcpconfig.properties文件放在src目录下即可。
1.3,连接池工具类DBCPUtils
在连接池工具类中,我们通过加载读取刚才的properties配置文件来连接数据库,把这部分可以写在静态代码块当中,当类加载的时候加载静态代码块,而且只加载一次。连接池工具类中除了连接数据库还要提供一个获取数据源DateSource和获取连接的方法。
package com.test.utils;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class DBCPUtils {
private static DataSource dataSource = null;
static {
Properties prop = new Properties();
//加载配置文件
InputStream is = DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
try {
prop.load(is);
dataSource = BasicDataSourceFactory.createDataSource(prop);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource() {
return dataSource;
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}
2,C3P0连接池
2.1,所需jar包
2.2,c3p0-config.xml文件的基本配置
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<!-- 四个基本配置 -->
<property name="user">root</property>
<property name="password">1234</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/dbutils_test</property>
<!-- 其他配置 -->
<!--连接池中保留的最大连接数,Default: 15 -->
<property name="maxPoolSize" value="100" />
<!--连接池中保留的最小连接数-->
<property name="minPoolSize" value="1" />
<!--初始化时获取的连接数,Default: 3 -->
<property name="initialPoolSize" value="10" />
<!--最大空闲时间,60秒内未使用则连接被丢弃,若为0则永不丢弃,Default: 0 -->
<property name="maxIdleTime" value="30" />
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数,Default: 3 -->
<property name="acquireIncrement" value="5" />
<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量,
但由于预缓存的statements属于单个connection而不是整个连接池,
所以设置这个参数需要考虑到多方面的因素,
如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭,
Default: 0-->
<property name="maxStatements" value="0" />
<!--每60秒检查所有连接池中的空闲连接,Default: 0 -->
<property name="idleConnectionTestPeriod" value="60" />
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts" value="30" />
<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常,
但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接,
如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。
Default: false-->
<property name="breakAfterAcquireFailure" value="true" />
<!--因性能消耗大请只在需要的时候使用它,如果设为true那么在每个connection提交的
时候都将校验其有效性,建议使用idleConnectionTestPeriod或automaticTestTable
等方法来提升连接测试的性能。Default: false -->
<property name="testConnectionOnCheckout" value="false" />
</default-config>
</c3p0-config>
注意:c3p0-config.xml是自动查找的,不用通过类加载的方式,所以该配置文件的名字不能更改,放在src下即可。
2.3,连接池工具类C3P0Utils
package com.test.utils;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
public static ComboPooledDataSource getDataSource() {
return dataSource;
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}
3,小结
不管是使用以上哪个连接池,都应该在连接池的工具类当中对外提供数据源DataSource和连接Connection。比如说,当我们操作数据库使用到DbUtils工具类库的时候,就会使用到QueryRunner类,如下:
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
我们就需要参数”C3P0Utils.getDataSource()”或者”DBCPUtils.getDataSource()”来获取数据源,然后用queryRunner的相关方法去执行SQL语句。我们还可以直接通过C3P0Utils.getConnection()或者DBCPUtils .getConnection()来获取数据库的连接。
DataSource是sun公司为java和数据库连接提供的一种接口规范,比如原生的jdbc连接;
BasicDataSource是dbcp封装了jdbc对dataSource接口的实现;
ComboPooledDataSource是c3p0封装了jdbc对DataSource接口的实现。
4,二者区别
C3P0是一个开源的JDBC连接池,目前使用它的开源项目有Hibernate,Spring等。
DBCP(DataBase connection pool),数据库连接池。是 Apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。
单独使用dbcp需要3个包:
commons-dbcp.jar //连接池的实现
commons-pool.jar //连接池实现的依赖库
commons-collections.jar //通用集合库
DBCP没有自动的去回收空闲连接的功能,C3P0有自动回收空闲连接功能 ;
两者主要是对数据连接的处理方式不同:
C3P0提供最大空闲时间,DBCP提供最大连接数。
C3P0当连接超过最大空闲连接时间时,当前连接就会被断掉;
DBCP当连接数超过最大连接数时,所有连接都会被断开。