DBCP-C3P0连接池

本文介绍了数据库连接池的概念,旨在解决频繁数据库连接与关闭带来的资源浪费问题。文章详细讲解了DBCP和C3P0这两个开源数据源的使用,包括它们的依赖配置、连接池参数设置以及在Java项目中的实际应用。通过实例展示了如何在代码中创建数据源、获取和释放连接,从而提高数据库操作效率。
摘要由CSDN通过智能技术生成

1、 数据库连接池

数据库的连接测试,一般的流程像开始--执行--关闭,这样频繁的连接关闭操作,非常的浪费系统资源,数据库连接池的使用,解决了这一问题,连接池是先准备一些资源,等待程序来连接数据库。连接池可以设置最大连接数、最小连接数、等待超时等操作。

怎么使用数据库连接池?

  • 编写连接池,实现一个接口:DataSource

开源数据源实现: DBCP   C3P0    Druid  ,使用这些数据库连接池,可以让开发者在项目开发中不需要编写连接数据库代码。

2、DBCP 的使用

需要的依赖环境:

        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>commons-pool</groupId>
            <artifactId>commons-pool</artifactId>
            <version>1.4</version>
        </dependency>

DBCP配置文件

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true
username=root
password=123456

#<!-- 初始化连接 -->
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000


#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED

实现代码:先创建一个maven项目,导入需要的开发环境。

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>commons-pool</groupId>
            <artifactId>commons-pool</artifactId>
            <version>1.6</version>
        </dependency>
    </dependencies>

工具类:

package com.DBCP.util;

import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class jdbc_dbcp_Util {
    private  static  DataSource dataSource = null;
    static {
        try {
            //        连接配置文件
            InputStream in = jdbc_dbcp_Util.class.getClassLoader().getResourceAsStream("dbcp.properties");
            Properties properties = new Properties();
            properties.load(in);
            //      创建数据源 工厂模式------》创建
            dataSource = BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 获取连接
    public static Connection getConnect() throws SQLException {
         return dataSource.getConnection();
    }
//    释放连接
    public static void release(Connection connection, Statement statement, ResultSet resultSet){
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

实现类:

package com.DBCP;

import com.DBCP.util.jdbc_dbcp_Util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class dbcpTest {
    private  static  Connection connect =null;
    private  static  PreparedStatement preparedStatement =null;
    private  static ResultSet resultSet =null;
    public static void main(String[] args) {
        try {
//            获取连接
            connect = jdbc_dbcp_Util.getConnect();
//            关闭事务自动提交,自动开启事务
            connect.setAutoCommit(false);
            String sql = "select * from account where id = ? ";
//            处理sql语句
            preparedStatement = connect.prepareStatement(sql);
            preparedStatement.setInt(1,1);
//            执行sql语句
            resultSet = preparedStatement.executeQuery();
            while(resultSet.next()) System.out.println(resultSet.getObject("NAME"));
//             事务提交
            connect.commit();
//          开启事务自动提交
            connect.setAutoCommit(true);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
//            关闭连接
            jdbc_dbcp_Util.release(connect,preparedStatement,resultSet);
        }
    }
}

3 、c3p0的使用

所需要的环境:

<!--        c3p0-->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>mchange-commons-java</artifactId>
            <version>0.2.11</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

配置文件:


<!-- 自定义的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://localhost:3306/bank</property>
    <property name="user">root</property>
    <property name="password">123456</property>
 
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="minPoolSize">10</property>
  </default-config>

</c3p0-config>

工具类

package com.C3P0.util;

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

public class C3p0_util {
    private  static ComboPooledDataSource dataSource = null;
    static {
        try {
            //      创建数据源 工厂模式------》创建
            dataSource = new ComboPooledDataSource();
            dataSource.setDriverClass("com.mysql.jdbc.Driver");
            dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/bank");
            dataSource.setUser("root");
            dataSource.setPassword("123456");
     //     dataSource = new ComboPooledDataSource();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 获取连接
    public static Connection getConnect() throws SQLException {
        return dataSource.getConnection();
    }
    //    释放连接
    public static void release(Connection connection, Statement statement, ResultSet resultSet){
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

实现类

package com.C3P0;

import com.C3P0.util.C3p0_util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class C3p0Test {

    private  static Connection connect =null;
    private  static PreparedStatement preparedStatement =null;
    private  static ResultSet resultSet =null;
    public static void main(String[] args) {
        try {
//            获取连接
            connect = C3p0_util.getConnect();
//            关闭事务自动提交,自动开启事务
            connect.setAutoCommit(false);
            String sql = "select * from account where id = ? ";
//            处理sql语句
            preparedStatement = connect.prepareStatement(sql);
            preparedStatement.setInt(1,1);
//            执行sql语句
            resultSet = preparedStatement.executeQuery();
            while(resultSet.next()) System.out.println(resultSet.getObject("NAME"));
//             事务提交
            connect.commit();
//          开启事务自动提交
            connect.setAutoCommit(true);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
//            关闭连接
            C3p0_util.release(connect,preparedStatement,resultSet);
        }
    }
}

结论:无论使用什么数据源,本质都是一样的,DataSource接口不会变,方法不会变 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值