c3p0 连接池

Posted ooo0

tags:

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

C3P0数据源

  C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。C3P0数据源在项目开发中使用得比较多。

  c3p0与dbcp区别
  1. dbcp没有自动回收空闲连接的功能
  2. c3p0有自动回收空闲连接功能

 

创建c3p0-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!-- c3p0-config.xml必须位于类路径下面 -->

<c3p0-config>
    <!-- C3P0的缺省(默认)配置, 如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource();”这样写就表示使用的是C3P0的缺省(默认)配置信息来创建数据源 -->
    <default-config>
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/testsvnb?useSSL=false&amp;serverTimezone=Hongkong&amp;characterEncoding=utf-8&amp;autoReconnect=true</property>
        <property name="user">root</property>
        <property name="password">123456</property>

        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </default-config>

    <!-- C3P0的命名配置, 如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource("MySQL");”这样写就表示使用的是name是MySQL的配置信息来创建数据源 -->
    <named-config name="MySQL">
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/testsvnb?useSSL=false&amp;serverTimezone=Hongkong&amp;characterEncoding=utf-8&amp;autoReconnect=true</property>
        <property name="user">root</property>
        <property name="password">123456</property>

        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </named-config>

</c3p0-config>

 

创建JdbcUtils_C3P0:

package com.xc.jdbc.util;

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;

/**
 * @ClassName: JdbcUtils_C3P0
 * @Description: 数据库连接工具类
 * @author: 孤傲苍狼
 * @date: 2014-10-4 下午6:04:36
 */
public class JdbcUtils_C3P0 {

    private static ComboPooledDataSource ds = null;
    // 在静态代码块中创建数据库连接池
    static {
        try {
            // 通过代码创建C3P0数据库连接池
            // ds = new ComboPooledDataSource();
            // ds.setDriverClass("com.mysql.cj.jdbc.Driver");
            // ds.setJdbcUrl("jdbc:mysql://localhost:3306/testsvnb?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8&autoReconnect=true");
            // ds.setUser("root");
            // ds.setPassword("123456");
            // ds.setInitialPoolSize(10);
            // ds.setMinPoolSize(5);
            // ds.setMaxPoolSize(20);

            // 通过读取C3P0的xml配置文件创建数据源,C3P0的xml配置文件c3p0-config.xml必须放在src目录下
            ds = new ComboPooledDataSource();// 使用C3P0的默认配置来创建数据源
            // ds = new ComboPooledDataSource("MySQL");// 使用C3P0的命名配置来创建数据源

        } catch (Exception e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    /**
     * @Method: getConnection
     * @Description: 从数据源中获取数据库连接
     * @Anthor:孤傲苍狼
     * @return Connection
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        // 从数据源中获取数据库连接
        return ds.getConnection();
    }

    /**
     * @Method: release
     * @Description: 释放资源, 释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象
     * @Anthor:孤傲苍狼
     *
     * @param conn
     * @param st
     * @param rs
     */
    public static void release(Connection conn, Statement st, ResultSet rs) {
        if (rs != null) {
            try {
                // 关闭存储查询结果的ResultSet对象
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if (st != null) {
            try {
                // 关闭负责执行SQL命令的Statement对象
                st.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

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

    /**
     * @Method: getDataSource
     * @Description: 获取数据源
     * @Anthor:孤傲苍狼
     * @return DataSource
     */
    public static DataSource getDataSource() {
        // 从数据源中获取数据库连接
        return ds;
    }

}

 

创建测试类DataSourceTest:

package com.xc.jdbc.curd;

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

import org.junit.Test;

import com.xc.jdbc.util.JdbcUtils_C3P0;
import com.xc.jdbc.util.JdbcUtils_DBCP;

public class DataSourceTest {

    @Test
    public void c3p0DataSourceTest() {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        try {
            // 获取数据库连接
            conn = JdbcUtils_C3P0.getConnection();
            String sql = "insert into test1(name) values(?)";
            st = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
            st.setString(1, "gacl");
            st.executeUpdate();
            // 获取数据库自动生成的主键
            rs = st.getGeneratedKeys();
            if (rs.next()) {
                System.out.println(rs.getInt(1));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            JdbcUtils_C3P0.release(conn, st, rs);
        }
    }

}

 

参考文章:

https://www.cnblogs.com/xdp-gacl/p/4002804.html

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

C3P0连接池操作数据库

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

c3p0连接池 & JdbcUtils

c3p0数据库连接池管理

JAVA连接池技术

数据库连接池c3p0