首页 > 代码库 > c3p0 数据库连接池

c3p0 数据库连接池

C3P0连接池

c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0一般是与Hibernate,Spring等框架一块使用的,当然也可以单独使用。

dbcp没有自动回收空闲连接的功能,c3p0有自动回收空闲连接功能

使用c3p0需要导入c3p0.jarmchange-commons-.jar,如果操作的是Oracle数据库,那么还需要导入c3p0-oracle-thin-extras-pre1.jar

这里我使用的是MySQL数据库

这里我要说得有两种方法建立数据库连接池

第一种:通过代码连接数创建数据库连接池

首先准备一组数据库数据

如图

技术分享

在eclipse ee里面添加相应的驱动包

c3p0.jarmchange-commons-.jar,还有数据库连接的jar包

首先创建C3p0_first类文件

package com.c3p0.test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3p0_first {
    // 数据库连接池ComboPooledDataSource
    private static ComboPooledDataSource ds = null;
    // 在静态代码块中创建数据库连接池
    static {
        try {
            // 通过代码创建C3P0数据库连接池
            // 创建连接池对象
            ds = new ComboPooledDataSource();
            // 获取数据库连接
            ds.setDriverClass("com.mysql.jdbc.Driver");
            ds.setJdbcUrl("jdbc:mysql://localhost:3306/test02");
            ds.setUser("root");
            ds.setPassword("root");
            ds.setInitialPoolSize(10);// 初始化的连接数,取值应在为10
            ds.setMinPoolSize(5);//连接池中保留的最小连接数
            ds.setMaxPoolSize(20);//连接池中保留的最大连接数

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 从数据源中获取数据库连接的方法
    public static Connection getConnection() throws SQLException {
        // 从数据源中获取数据库连接
        return ds.getConnection();
    }

    // 释放链接
    public static void release(Connection conn) {

        if (conn != null) {
            try {
                // 将Connection连接对象还给数据库连接池
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

 

然后创建Testc3p0类文件

package com.c3p0.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.c3p0.enity.Employee;
import com.c3p0.jdbcUtils.JdbcUtils_C3P0;

public class Testc3p0 {

    public List<Employee> queryAll(){
        String sql = "select * from emp";
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        Employee ee = null;
        //创建一个集合来接受查询的数据
        List<Employee> list=new ArrayList<>();
        try {
            // 获取数据库连接
            conn = C3p0_first.getConnection();
            st = conn.prepareStatement(sql);// 执行SQL语句
            rs = st.executeQuery();// 返回结果
            while (rs.next()) {
                ee = new Employee(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5),
                        rs.getString(6), rs.getString(7));

                list.add(ee);
                System.out.println(list);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            JdbcUtils_C3P0.release(conn);
        }
        return list;
    }
    

}

再创建实体类employee类文件

用来存放查询的数据,并且设置想应的set和get,构造方法

package com.c3p0.enity;

public class Employee {
    private String  EmpId;
    private String  Empname;
    private String  Pwd; 
    private String  LoginDate;
    private String  Adress;
    private String  Jod;
    private String  Email;
    
    public Employee() {
        super();
    }
    public Employee(String empname, String pwd, String loginDate, String adress, String jod, String email) {
        super();
        Empname = empname;
        Pwd = pwd;
        LoginDate = loginDate;
        Adress = adress;
        Jod = jod;
        Email = email;
    }
    public Employee(String empId, String empname, String pwd, String loginDate, String adress, String jod,
            String email) {
        super();
        EmpId = empId;
        Empname = empname;
        Pwd = pwd;
        LoginDate = loginDate;
        Adress = adress;
        Jod = jod;
        Email = email;
    }
    public String getEmpId() {
        return EmpId;
    }
    public void setEmpId(String empId) {
        EmpId = empId;
    }
    public String getEmpname() {
        return Empname;
    }
    public void setEmpname(String empname) {
        Empname = empname;
    }
    public String getPwd() {
        return Pwd;
    }
    public void setPwd(String pwd) {
        Pwd = pwd;
    }
    public String getLoginDate() {
        return LoginDate;
    }
    public void setLoginDate(String loginDate) {
        LoginDate = loginDate;
    }
    public String getAdress() {
        return Adress;
    }
    public void setAdress(String adress) {
        Adress = adress;
    }
    public String getJod() {
        return Jod;
    }
    public void setJod(String jod) {
        Jod = jod;
    }
    public String getEmail() {
        return Email;
    }
    public void setEmail(String email) {
        Email = email;
    }
    
}

最后,创建测试类

package com.c3p0.test;

import java.util.List;
import com.c3p0.enity.Employee;

public class Test {

    public static void main(String[] args) {
        Testc3p0 tc=new Testc3p0();
        List<Employee> list=tc.queryAll();
        
        for(Employee ee:list){
            System.out.println(ee.getEmpname()+"\t"+ee.getAdress()+"\t"+ee.getEmail()+"\t"+ee.getLoginDate()+"\t");
        }

    }

}

打印出查询结果

技术分享

 

第二种数据库连接池的方法,配置文件,在src目录下面创建c3p0-config.xml的配置文件,文件名必须为这个

<c3p0-config>  
      
   <!--  C3P0的缺省(默认)配置,-->  
   <!-- 如果在代码中“ComboPooledDataSourceds = new ComboPooledDataSource();”这样写就表示使用的是C3P0的缺省(默认)配置信息来创建数据源 -->  
     
   <default-config>  
        <property name="driverClass">com.mysql.jdbc.Driver</property>  
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test02</property>  
        <property name="user">root</property>  
        <property name="password">root</property>  
             <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default:3 -->  
        <property name="acquireIncrement">5</property>  
             <!--初始化的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3-->  
        <property name="initialPoolSize">10</property>  
             <!--连接池中保留的最小连接数-->  
        <property name="minPoolSize">5</property>  
             <!--连接池中保留的最大连接数。Default:15 -->  
        <property name="maxPoolSize">20</property>  
             <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->  
        <property name="acquireRetryAttempts">30</property>  
             <!--两次连接中间隔时间,单位毫秒。Default: 1000 -->  
        <property name="acquireRetryDelay">1000</property>  
             <!--连接关闭时默认将所有未提交的操作回滚。Default: false -->  
         <property name="autoCommitOnClose">false</property>  
    </default-config>
</c3p0-config>

然后数据库的连接方法与上面一样。只需要把C3p0_first文件里面的连接数据库的内容改一下

把连接部分注释掉

package com.c3p0.test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3p0_first {
    // 数据库连接池ComboPooledDataSource
    private static ComboPooledDataSource ds = null;
    // 在静态代码块中创建数据库连接池
    static {
        try {
            // 通过代码创建C3P0数据库连接池
            // 创建连接池对象
            /*ds = new ComboPooledDataSource();
            // 获取数据库连接
            ds.setDriverClass("com.mysql.jdbc.Driver");
            ds.setJdbcUrl("jdbc:mysql://localhost:3306/test02");
            ds.setUser("root");
            ds.setPassword("root");
            ds.setInitialPoolSize(10);// 初始化的连接数,取值应在为10
            ds.setMinPoolSize(5);//连接池中保留的最小连接数
            ds.setMaxPoolSize(20);//连接池中保留的最大连接数*/
            ds= new ComboPooledDataSource();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 从数据源中获取数据库连接的方法
    public static Connection getConnection() throws SQLException {
        // 从数据源中获取数据库连接
        return ds.getConnection();
    }

    // 释放链接
    public static void release(Connection conn) {

        if (conn != null) {
            try {
                // 将Connection连接对象还给数据库连接池
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

测试结果

技术分享

 

c3p0 数据库连接池