数据库连接池C3P0和DBCP的使用
学习小结,欢迎指正,不喜勿喷。
C3P0的使用:
步骤:
1.准备C3P0所需的jar包(本人使用的是:c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar)。
2.准备数据库驱动(本人使用:mysql-connector-java-5.1.46.jar)。
3.新建web项目。
4.将所需jar包放在lib目录下。
5.在src下添加数据库连接池的配置文件,文件名称必须为 c3p0-config.xml,配置文件可以使用默认配置参数来初始化连接池,也可以使用命名配置来初始化连接池。
<c3p0-config>
<!-- 使用默认配置读取连接池对象 -->
<default-config>
<!-- 连库要素 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
<property name="user">数据库连接账号</property>
<property name="password">数据库密码</property>
<!-- 连接池参数 -->
<!-- 初始化连接数量。即初始化连接池时,创建的数据库连接数量 -->
<property name="initialPoolSize">5</property>
<!-- 连接池中允许存在的最大数据库连接数量 -->
<property name="maxPoolSize">8</property>
<!-- 线程最大等待时间 。当连接池中所有连接均被占用时,线程等待的最大时间,超过该时间,抛出SQLException-->
<property name="checkoutTimeout">1000</property>
<!-- 连接允许空闲时间。数据库连接处于空闲状态的时间,超过改时间,断开数据库连接 -->
<property name="maxIdleTime">1000</property>
</default-config>
<!-- 使用命名配置 -->
<named-config name="mysql">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
<property name="user">aipande</property>
<property name="password">[email protected]</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
<property name="maxIdleTime">1000</property>
</named-config>
</c3p0-config>
6.创建测试类
package test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import utils.c3p0Util;
public class test01 {
public static void main(String[] args) throws SQLException {
//初始化连接池,这里表示使用命名配置创建连接池对象
ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
//获取数据库连接
Connection conn = dataSource.getConnection();
//获取会话
Statement state = conn.createStatement();
String sql = "SELECT UserName FROM student WHERE ID = 1001";
//执行sql语句
ResultSet res = state.executeQuery(sql);
//获取执行结果
while(res.next()){
System.out.println("姓名:"+res.getString("username"));
}
}
}
7.结果
DBCP的使用:
步骤:
1.准备DBCP依赖jar包、数据库驱动jar包。
2-4步骤同上。
5.使用配置文件来配置数据库连接池初始化时的参数。在src下创建xxx.properties配置文件,示例如下:
dbcp-config.properties
#基本的设置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
username=数据库连接账号
password=数据库连接密码
#初始化时连接池中connection数量
initialSize=10
#最大连接数量
maxActive=50
#最大的空闲连接数量
maxIdle=20
#最小的空闲链接数量
minIdle=5
#最大的等待时间,单位是毫秒
maxWait=60000
#建立连接时的附加参数,如果指定的编码不一致数据库中会出现乱码
connectionProperties=useUnicode=true;characterEncoding=utf8
#是否开启自动提交,跟事务的控制有关
defaultAutoCommit=true
#指定由连接池所创建的连接的事务隔离级别(TransactionIsolation)。
defaultTransactionIsolation=REPEATABLE_READ
6.创建测试类
package test;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import util.DbcpUtil;
public class test01 {
public static void main(String[] args) throws Exception {
//获取配置文件参数
InputStream ins = test01.class.getClassLoader().getResourceAsStream("dbcp-config.properties");
Properties pro = new Properties();
pro.load(ins);
//获取数据库连接池对象
DataSource datasource = BasicDataSourceFactory.createDataSource(pro);
//获取数据库连接
Connection conn = datasource.getConnection();
//获取会话
Statement statement = conn.createStatement();
//定义sql语句
String sql = "SELECT UserName FROM student WHERE ID = 1001";
//执行sql语句
ResultSet res = statement.executeQuery(sql);
//获取执行结果
while(res.next()){
System.out.println("姓名:"+res.getString("username"));
}
}
}
7.结果
优化:
可以发现,测试类中,每次访问数据库都需要获取数据库连接池对象,再通过连接池对象获取数据库连接。可以将这些操作放在一个工具类中,工具类中应该包含获取数据库连接、关闭数据库连接的方法。示例如下:
package utils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class c3p0Util {
//获取数据源/数据库连接池对象,ComboPooledDataSource就是连接池类
private static ComboPooledDataSource ds = new ComboPooledDataSource("mysql");
//返回连接池
public static ComboPooledDataSource getDateSource(){
return ds;
}
//公共的获取数据库连接的方法
public static Connection getConnection(){
Connection conn = null;
try {
conn = ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//公共的关闭方法
public static void close(Connection conn,Statement statement) throws SQLException{
close(conn,statement,null);
}
//公共的关闭方法
public static void close(Connection conn,Statement statement,ResultSet res) throws SQLException{
if(conn != null){
conn.close();
}
if(statement != null){
statement.close();
}
if(res != null){
res.close();
}
}
}
总结:
基本流程:
1.准备连接池所需jar包、数据库驱动jar包。
2.创建配置文件,用于配置数据库连接池生成的所需的参数。