C3P0为开源连接池,hibernate框架默认推荐使用c3po连接池,c3p0使用步骤如下,案例中配置将教会你c3p0多数据源的配置和使用。
1)导入c3p0的jar包
c3p0-0.9.1.2.jar 核心包
2)创建连接池对象ComboPooledDataSource对象
3)设置连接参数(url,user,password,dirverClass)
4)设置连接池参数(初始连接数,最大连接数,最大等待时间)
5)获取连接对象(getConnection() 方法)
方式一:不使用c3p0-config.xml配置文件,直接定义连接池,本人写了@Test测试方法,代码如下。
@Test
public void test1(){
try {
//1.创建连接池对象
ComboPooledDataSource ds = new ComboPooledDataSource();
//2.设置连接参数
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/test");
ds.setUser("root");
ds.setPassword("root");
//3.设置连接池参数
ds.setInitialPoolSize(5);// 初始化连接数
ds.setMaxPoolSize(8);//最大连接数
ds.setCheckoutTimeout(3000);//最大等待时间
//4.获取连接
for(int i=1;i<=9;i++){
Connection conn = ds.getConnection();
System.out.println(conn);
if(i==5){
/**
* 把连接对象放回连接池
*/
conn.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}方式二:使用c3p0-config.xml配置文件来创建连接池,适合多数据源。
第一步:首先在项目src目录中新建c3p0-config.xml文件,系统默认会在src目录下寻找名为c3p0-config.xml配置文件,以下配置为c3p0多数据源的配置方式。
<?xml version="1.0" encoding="utf-8"?> <c3p0-config> <!-- 默认配置 --> <!-- 属性规则:name值和方法名称相同 --> <default-config> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8</property> <property name="user">root</property> <property name="password">1234</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="initialPoolSize">5</property> <property name="maxPoolSize">12</property> <property name="checkoutTimeout">3000</property> </default-config> <!-- 命名配置,如果有多个数据库,可以使用命名配置来区分 --> <named-config name="test2DB"> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8</property> <property name="user">root</property> <property name="password">1234</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="initialPoolSize">5</property> <property name="maxPoolSize">14</property> <property name="checkoutTimeout">3000</property> </named-config> </c3p0-config>
第二步:分别使用默认配置和命名配置来创建不同的连接池。
/**
* 使用配置文件方式读取参数信息
* 注意: c3p0会默认查询类路径的c3p0-config.xml文件,文件名不能错!!
*/
@Test
public void test2(){
try {
//1.创建连接池对象(方式一: 使用默认配置(default-config))
//ComboPooledDataSource ds = new ComboPooledDataSource();
//2.创建连接池对象(方式二: 使用命名配置(named-config:test2DB))
ComboPooledDataSource ds = new ComboPooledDataSource("test2DB");
//2.获取连接
for(int i=1;i<=9;i++){
Connection conn = ds.getConnection();
System.out.println(conn);
if(i==5){
/**
* 把连接对象放回连接池
*/
conn.close();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}C3P0多数据源连接池的配置使用讲完了,那么如何来自定义C3P0Utils工具类呢?定义方法如下。
package com.baidu.utils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* C3P0版本的工具类
* @author APPle
*
*/
public class C3P0Util {
//创建连接池对象
//使用无参的构造方法---使用默认配置:default-config
//规则:项目中连接一个数据库就使用一个连接池对象
private static DataSource ds = new ComboPooledDataSource();
//使用命名空间配置来创建连接池对象,可用来自由切换数据库连接
//private static DataSource ds = new ComboPooledDataSource("test2DB");
/**
* 提供给java程序获取连接的方法
*/
public static Connection getConnection(){
try {
Connection conn = ds.getConnection();
return conn;
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
* 返回数据源对象
* @return
*/
public static DataSource getDataSource(){
return ds;
}
public static void close(ResultSet rs,Statement stmt,Connection conn){
try {
if(rs!=null)rs.close();
if(stmt!=null)stmt.close();
if(conn!=null)conn.close(); //把连接返回连接池
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}C3P0多数据源的作用就是可以在javaweb项目中自由切换数据库连接,非常的方便。