DBCP数据库连接池笔记-基本使用

这篇博客记录了初次使用DBCP数据库连接池的学习过程,包括所需的commons-dbcp和commons-pool库的下载,配置文件dbconfig.properties的设置,以及在创建DataSource对象时的静态代码块。在测试中遇到的两个问题分别是:1) 抛出AbstractMethodError异常,通过升级mysql-connector解决;2) 高版本MySQL提示SSL连接警告,通过设置connectionProperties为useSSL=true解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初次学习DBCP数据库连接池的使用,所以写篇博客作为笔记…
DBCP数据库连接池需要commons-dbcp和commons-pool jar包的支持
下载地址:http://download.youkuaiyun.com/detail/mass_effect/9841656

配置文件dbconfig.properties:
文件路径在classes目录下

#连接设置,使用的是mysql数据库
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jsp
username=root
password=root

#初始化连接
initialSize=10

#最大空闲连接
maxIdle=20

#最小空闲连接
minIdle=5

#最大连接数量
maxActive=50

#JDBC驱动建立连接时附带的连接属性的格式必须为这样
connectionProperties=useUnicode=true;characterEncoding=UTF8;useSSL=true

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

#指定由连接池所创建的连接的事务级别(TransactionIsolation)
#可用值为:NONE,READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READ,SERIALIZABLE
defaultTransactionIsolation=READ_COMMITTED

#是否在自动回收超时连接的时候打印连接的超时错误
logAbandoned=true

#是否自动回收超时连接
removeAbandoned=true

#超时时间(以秒数为单位)
#设置超时时间有一个要注意的地方,超时时间=现在的时间-程序中创建Connection的时间,如果maxActive比较大,比如过100,那么#removeAbandonedTimeout可以设置长一点比如180,也就是三分钟无响应的连接进行回收当然应用的不同设置长度也不同。
removeAbandonedTimeout=180

#超时等待时间以毫秒为单位
#maxWait代表当Connection用尽了,多久之后进行回收丢失连接
maxWait=1000

创建一个工具类,实例化javax.sql.DataSource对象,核心代码在静态代码块

package pers.msidolphin.newcase.utils;

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;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;

public class DBCPUtils {

    private static DataSource dataSource = null;

    static {
        InputStream in = DBCPUtils.class.getClassLoader().getResourceAsStream("./dbcpconfig.properties");
        Properties properties = new Properties();
        try {
            properties.load(in);
            dataSource = BasicDataSourceFactory.createDataSource(properties);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            throw new ExceptionInInitializerError(e);
        } catch (Exception e) {
            // TODO: handle exception
            throw new ExceptionInInitializerError(e);
        }
    }

    public static Connection getConnection() throws SQLException {
        return DBCPUtils.dataSource.getConnection();
    }

    public static void release(Connection connection) {
        try {
            if(connection != null) {
                connection.close();
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
        connection = null;
    }

    public static void release(Statement statement) {
        try {
            if(statement != null) {
                statement.close();
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
        statement = null;
    }

    public static void release(ResultSet resultSet) {
        try {
            if(resultSet != null) {
                resultSet.close();
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
        resultSet = null;
    }
}

测试类:

package pers.msidolphin.newcase.junit;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import pers.msidolphin.newcase.utils.DBCPUtils;


public class DateSourceTest {

    @Test 
    public  void testDBCP() {
        // TODO Auto-generated method stub
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
            connection = DBCPUtils.getConnection();
            String sql = "select count(*) from customer";
            statement = connection.prepareStatement(sql);
            resultSet = statement.executeQuery();
            if(resultSet.next()) {
                System.out.println(resultSet.getInt(1));
            }
        }catch(Exception ex) {
            throw new RuntimeException(ex);
        }finally {
            DBCPUtils.release(resultSet);
            DBCPUtils.release(statement);
            DBCPUtils.release(connection);
        }
    }
}

测试过程中遇到了一些问题:
1、第一次测试时抛出了AbstractMethodError异常,检查代码无误后查阅资料发现是因为mysql驱动版本太旧,使用的是5.0.8,而引入的dbcp jar包版本为2.1.1,如果要使用dbcp2.0,那么mysql-connector必须使用5.1.3以上版本
2、引入了高版本的mysql-connector后进行测试,虽然结果能够显示出来但是多打印出了一段话:
WARN: Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
原因是MySQL在高版本需要指明是否进行SSL连接,所以给配置文件中的connectionProperties属性添加useSSL=true就行了。
暂时就到这了…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值