java基础之JDBC七:C3P0连接池的使用

使用C3P0的前提是需要引入jar包

具体使用如下:

/**
 * c3p0的应用
 * 前提:引入c3p0的jar包
 */
public class Test {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stat = null;
        ResultSet rs = null;
        try {
            //C3P0会自动读取src下的c3p0-config.xml文件 获取配置信息(driver,url,username,password等)
            //用ComboPooledDataSource这个对象从连接池获取Connection 参数为配置文件的name 可不传则使用默认配置
            ComboPooledDataSource cpds = new ComboPooledDataSource("dbTemp2");

            //也可以不使用配置文件 自己设置参数 但是不推荐
            /*
            cpds.setJdbcUrl("");
            cpds.setDriverClass("");
            cpds.setUser("");
            cpds.setPassword("");*/
       //从连接池中获取Connection对象
            conn = cpds.getConnection();
            //后面的代码跟我们之前的代码基本一样
            stat = conn.createStatement();
            String sql = "SELECT * FROM users";
            rs = stat.executeQuery(sql);
            while (rs.next()) {
                int id = rs.getInt("uid");
                String name = rs.getString("uname");
                String psw = rs.getString("psw");
                System.out.println(id + "--" + name + "--" + psw);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //这里先使用之前工具类的释放资源的方法
            JDBCSimpleUtils.release(conn, stat, rs);
        }
    }
}

c3p0-config.xml文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!--默认配置-->
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///dbTemp</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="minPoolSize">5</property>
        <property name="initialPoolSize">5</property>
    </default-config>
    <!--name为dbTemp2的配置-->
    <named-config name="dbTemp2">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///dbTemp2</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="minPoolSize">5</property>
        <property name="initialPoolSize">5</property>
    </named-config>
</c3p0-config>

百尺竿头 更进一步  抽取C3P0简单工具类来使用:

/**
 * C3P0简单工具类
 */
public class C3P0SimpleUtils {
    //1. 构造私有
    private C3P0SimpleUtils() {
    }

    //2. 定义一个变量, 用来记录连接池对象. 由于所有的连接池对象都继承自DataSource 所以这里使用多态的形式
    private static DataSource ds = new ComboPooledDataSource();

    //3. 对外提供一个方法, 用来获取连接池对象.

    /**
     * 获取连接池对象.
     *
     * @return
     */
    public static DataSource getDataSource() {
        return ds;
    }

    //4. 对外提供一个方法, 用来获取连接对象. 连接对象是从数据库连接池中获取的.

    /**
     * 从数据库连接池获取连接对象
     * @return
     */
    public static Connection getConnection() {
        try {
            return ds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    //5. 释放资源 释放资源的方法跟之前提取的JDBC简单工具类基本一样
    public static void release(Connection conn, Statement stat, ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (stat != null) {
                    stat.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (conn != null) {
                        conn.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void release(Connection conn, Statement stat) {
        try {
            if (stat != null) {
                stat.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

那么我们使用我们提取出来的工具类来操作一下:

/**
 * 使用c3p0工具类
 */
public class Test {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stat = null;
        ResultSet rs = null;
        try {
            //这里使用我们刚抽取出的工具类来从连接池中取出数据库连接对象
            conn = C3P0SimpleUtils.getConnection();
            //下面代码跟之前一样
            stat = conn.createStatement();
            String sql = "SELECT * FROM users";
            rs = stat.executeQuery(sql);
            while (rs.next()) {
                int id = rs.getInt("uid");
                String name = rs.getString("uname");
                String psw = rs.getString("psw");
                System.out.println(id + "--" + name + "--" + psw);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //这里可以使用我们C3P0SimpleUtils工具类的释放资源的方法
            C3P0SimpleUtils.release(conn, stat, rs);
        }
    }
}