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项目中自由切换数据库连接,非常的方便。