C3P0连接池

Posted Zennon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C3P0连接池相关的知识,希望对你有一定的参考价值。

1.C3P0连接池
* 创建C3P0连接池的工具类:我们可以使用工具类获取数据库连接对象conn
* 连接池的规范接口:javax.sql.DataSource 接口
* 接口中的获取连接的方法:Connection getConnection() 尝试建立与此 DataSource 对象所表示的数据源的连接。
*
* C3P0连接池实现了连接池的规范接口DataSource,重写了接口中获取连接的方法 getConnection
* com.mchange.v2.c3p0.ComboPooledDataSource implements DataSource接口
*
* C3P0连接池工具类的创建步骤:
* 1.在成员位置创建一个ComboPooledDataSource对象
* 2.创建一个静态代码块(只执行一次,提高效率)
* 使用ComboPooledDataSource中的setXXX方法,设置数据库的4大基本信息
* 注册驱动,url,用户名,密码
* 3.创建一个静态方法,方法中使用ComboPooledDataSource对象重写的getConnection获取数据库连接对象Connection并返回
* 4.创建一个静态方法,用于释放资源

或者:
* C3P0连接池工具类的创建步骤:
* 1.在成员位置创建一个ComboPooledDataSource对象
* 2.创建一个xml文件,名字必须叫c3p0-config.xml,放在src下边,里边的根元素和其它元素必须按照要求编写
* C3PO连接池,会自动解析c3p0-config文件,给ComboPooledDataSource赋4大基本信息的值
* 如果即使用了xml文件,有使用了静态代码块赋值,优先使用静态代码块
* 3.创建一个静态方法,方法中使用ComboPooledDataSource对象重写的getConnection获取数据库连接对象Connection并返回
* 4.创建一个静态方法,用于释放资源

1.1创建DBCPUtils工具类(C3P0Utils);

package cn.itcast.demo01.DBCPUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
//1.在成员位置创建一个ComboPooledDataSource对象
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//2.创建一个静态代码块(只执行一次,提高效率)(如果使用了xml文件,这步可以省略)
static{
try {
//使用ComboPooledDataSource中的setXXX方法,设置数据库的4大基本信息
//注册驱动,url,用户名,密码
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/day05");
dataSource.setUser("root");
dataSource.setPassword("root");
} catch (Exception e) {
System.out.println(e);
}
}

//3.创建一个静态方法,方法中使用ComboPooledDataSource对象重写的getConnection获取数据库连接对象Connection并返回
public static Connection getConnection(){
try {
//从连接池中获取数据库连接对象并返回
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("数据库连接失败!");
}
}

//4.创建一个静态方法,用于释放资源
public static void close(ResultSet rs,Statement stat,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(stat!=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();//注意close方法不是把连接关闭,而是把连接归还给连接池
} catch (SQLException e) {
e.printStackTrace();
}
}
}
} 

 

 

1.2测试C3P0连接池工具类

package cn.itcast.demo02.test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import cn.itcast.demo01.Utils.C3P0Utils;
import cn.itcast.demo01.Utils.C3P0UtilsXML;

/*
* 测试C3P0连接池工具类
*/
public class TestC3P0Utils {
public static void main(String[] args) {
test02();
}

private static void test02() {
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
//使用C3P0连接池工具类C3P0UtilsXML获取数据库连接对象
conn = C3P0UtilsXML.getConnection();
//System.out.println(conn);
//获取执行者对象
stat = conn.createStatement();
//执行sql语句
String sql = "SELECT * FROM category";
rs = stat.executeQuery(sql);
//处理结果集
while(rs.next()){
System.out.println(rs.getInt("cid")+"\t"+rs.getString("cname"));
}
} catch (Exception e) {
System.out.println(e);
}finally {
//释放资源 使用DBCP连接池工具类C3P0UtilsXML中的方法
C3P0Utils.close(rs, stat, conn);
}

}

private static void test01() {
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
//使用C3P0连接池工具类C3P0Utils获取数据库连接对象
conn = C3P0Utils.getConnection();
//System.out.println(conn);
//获取执行者对象
stat = conn.createStatement();
//执行sql语句
String sql = "SELECT * FROM category";
rs = stat.executeQuery(sql);
//处理结果集
while(rs.next()){
System.out.println(rs.getInt("cid")+"\t"+rs.getString("cname"));
}
} catch (Exception e) {
System.out.println(e);
}finally {
//释放资源 使用DBCP连接池工具类DBCPUtils中的方法
C3P0Utils.close(rs, stat, conn);
}

}
}

 

 

2.DBCP连接池
* 创建DBCP连接池的工具类:我们可以使用工具类获取数据库连接对象conn
* 连接池的规范接口:javax.sql.DataSource 接口
* 接口中的获取连接的方法:Connection getConnection() 尝试建立与此 DataSource 对象所表示的数据源的连接。
*
* DBCP连接池实现了连接池的规范接口DataSource,重写了接口中获取连接的方法 getConnection
* org.apache.commons.dbcp.BasicDataSource
*
* DBCP连接池工具类的创建步骤:
* 1.在成员位置创建一个BasicDataSource对象
* 2.创建一个静态代码块(只执行一次,提高效率)
* 使用BasicDataSource中的setXXX方法,设置数据库的4大基本信息
* 注册驱动,url,用户名,密码
* 3.创建一个静态方法,方法中使用BasicDataSource对象重写的getConnection获取数据库连接对象Connection并返回
* 4.创建一个静态方法,用于释放资源
或者:
* DBCP连接池提供了一个工厂类
* org.apache.commons.dbcp.BasicDataSourceFactory
* 工厂类中提供了一个方法,用于创建BasicDataSource对象
* public static DataSource createDataSource(Properties properties)
*
* 实现步骤:
* 1.创建一个properties配置文件,使用键值对存储数据库的4大基本信息
* 2.在成员位置创建一个DataSource变量
* 3.创建一个静态代码块
* a.使用Properties集合+IO流读取配置文件,把配置文件的键值对保存到集合中
* b.使用连接池的工厂类BasicDataSourceFactory中的方法createDataSource,创建BasicDataSource连接池对象
* createDataSource方法会自动的从Properties集合中读取键值对,给BasicDataSource对象赋值
* 4.创建一个静态方法,用于返回数据库连接对象Connection
* 5.创建一个静态方法,用于释放资源

2.1创建DBCPUtils工具类(C3P0Utils);

package cn.itcast.demo01.DBCPUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.commons.dbcp.BasicDataSource;

public class DBCPUtils {
//1.在成员位置创建一个BasicDataSource对象
private static BasicDataSource dataSource = new BasicDataSource();
//2.创建一个静态代码块(只执行一次,提高效率)(如果使用了properties配置文件,这步可以省略)
static{
//使用BasicDataSource中的setXXX方法,设置数据库的4大基本信息
//注册驱动,url,用户名,密码,必须设置
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/day05");
dataSource.setUsername("root");
dataSource.setPassword("root");
//可选设置信息
dataSource.setInitialSize(10);//初始化连接数量
dataSource.setMaxActive(50);//最大连接数量
}

//3.创建一个静态方法,方法中使用BasicDataSource对象重写的getConnection获取数据库连接对象Connection并返回
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
/*
* 数据库连接对象,如果获取失败了,那么程序就没有必须继续执行
* 把编译异常,转换为运行时异常
*/
throw new RuntimeException("数据库连接失败!");
}
}

//4.创建一个静态方法,用于释放资源
public static void close(ResultSet rs,Statement stat,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(stat!=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();//注意close方法不是把连接关闭,而是把连接归还给连接池
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

 

 

2.2 测试DBCP连接池工具类

package cn.itcast.demo02.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import cn.itcast.demo01.Utils.DBCPUtils;
import cn.itcast.demo01.Utils.DBCPUtilsConfig;


public class TestDBCPUtils {
public static void main(String[] args) {
test02();
}

/*
* 测试DBCPUtilsConfig
*/
private static void test02() {
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
try {
//使用DBCP连接池工具类DBCPUtilsConfig获取数据库连接对象
conn = DBCPUtilsConfig.getConnection();
//System.out.println(conn);
//获取预编译的执行者对象
String sql = "SELECT * FROM category WHERE cid IN (?,?,?)";
pst = conn.prepareStatement(sql);
//设置?占位符的实际参数
pst.setObject(1, 1);
pst.setObject(2, 2);
pst.setObject(3, 5);
//执行sql语句,获取结果集
rs = pst.executeQuery();
//处理结果集
while(rs.next()){
System.out.println(rs.getInt("cid")+"\t"+rs.getString("cname"));
}
} catch (Exception e) {
System.out.println(e);
}finally {
//释放资源
DBCPUtilsConfig.close(rs, pst, conn);
}
}

/*
* 测试DBCPUtils
*/
private static void test01() {
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
//使用DBCP连接池工具类DBCPUtils获取数据库连接对象
conn = DBCPUtils.getConnection();
//System.out.println(conn);
//获取执行者对象
stat = conn.createStatement();
//执行sql语句
String sql = "SELECT * FROM category";
rs = stat.executeQuery(sql);
//处理结果集
while(rs.next()){
System.out.println(rs.getInt("cid")+"\t"+rs.getString("cname"));
}
} catch (Exception e) {
System.out.println(e);
}finally {
//释放资源 使用DBCP连接池工具类DBCPUtils中的方法
DBCPUtils.close(rs, stat, conn);
}
}

}

 

3.创建Javabean

package cn.itcast.demo03.domain;

import java.io.Serializable;

/*
* 创建数据库表category的javabean类
* category表-->Category类
* 表中的字段(cid,cname)-->类中的成员变量
* 表中的行-->Category对象
* 
* javabean包含:
* 1.私有的成员变量
* 2.公共的get/set方法
* 3.空参数构造方法
* 4.toString方法
* 5.实现序列化接口
*/
public class Category implements Serializable {
/**
* 添加序列哈,防止序列化冲突异常
*/
private static final long serialVersionUID = 1L;
private int cid;
private String cname;

public Category() {
super();
}
public Category(int cid, String cname) {
super();
this.cid = cid;
this.cname = cname;
}

 

@Override
public String toString() {
return "Category [cid=" + cid + ", cname=" + cname + "]";
}

public int getCid() {
return cid;
}

public void setCid(int cid) {
this.cid = cid;
}

public String getCname() {
return cname;
}

public void setCname(String cname) {
this.cname = cname;
}

}

 

以上是关于C3P0连接池的主要内容,如果未能解决你的问题,请参考以下文章

C3P0连接池操作数据库

C3P0连接池工具类实现步骤及方法

c3p0连接池 & JdbcUtils

c3p0数据库连接池管理

JAVA连接池技术

数据库连接池c3p0