1. 数据库连接池 简介

实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们 采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、释放连接了,这些操作都交 给了连接池。

如何使用连接池:

Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。 这样应用程序可以方便的切换不同的连接池!DBCP、C3P0、Druid 就是几个常用的连接池。

2. DBCP连接池

2.1 简介

DBCP是Apache的一个开源的连接池。Tomcat中就内置了该连接池。

2.2 引入方式

1. 下载 JAR 包并导入

首先,从 https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi 下载dbcp连接池,我这里下载的是 commons-dbcp2-2.8.0-bin.zip 解压后commons-dbcp2-2.8.0.jar就是所需的文件。

然而,DBCP连接池有两个依赖:commons-logging-1.2-bin.zipcommons-pool2-2.9.0-bin.zip 下载后解压出Jar文件。

获得 jar 包后开始导入:

在IDEA中导入 jar 包,可以在项目中创建一个文件夹,然后右键点击文件夹,选择Add as Library,最后将需要的Jar包(也就是刚刚下载的三个jar包)导入即可。注意:使用了连接池并不会自带数据库连接驱动,所以数据库连接器的 jar 包也要导入。

注意:

不同版本的依赖以不同,如 dbcp-1.4 只需要 pool-1.5.6就可以了。这些也不用记,只需要 先下载dbcp的 jar 包并导入执行程序,程序会报NoClassDefFoundError,意思就是执行时发现需要后边的类,但找不到。

常用数据库连接池_bc

知道却什么后就可以从官网:https://commons.apache.org/proper/ 找到并下载对应的东西就可以了。

不得不说,这就逐渐体现出Maven的重要性了。

2.3 使用

DBCP中的BasicDateSource,就是 javax.sql.DateSource接口的实现类,创建其对象,对其进行配置,然后就可以通过这个对象获取数据库连接(Connection对象)了。以此来代替通过DriverManager获取连接对象。

DBCP工具类(使用 setXxx 配置):

public class DBCPUtils {
    private DBCPUtils(){}
    // 配置的相关信息
    public static final String DRIVERCLASS = "com.mysql.cj.jdbc.Driver";
    public static final String URL = "jdbc:mysql://localhost:3306/lianxi01?characterEncoding=utf-8&serverTimezone=UTC";
    public static final String USERNAME = "root";
    public static final String PASSWORD = "123456";
    private static BasicDataSource ds;

    static {
        // 代码配置法
        ds = new BasicDataSource();
        ds.setDriverClassName(DRIVERCLASS);   // 配置 驱动器名
        ds.setUrl(URL);                       // 配置 数据库地址
        ds.setUsername(USERNAME);             // 配置 数据库登录用户名
        ds.setPassword(PASSWORD);             // 配置 数据库登录密码

        ds.setMaxTotal(20);                   // 相当于DBCP1中的maxActive,表示最多有20条连接  默认:8
        ds.setMaxIdle(10);                    // 最大空闲连接数  默认:8
        ds.setMinIdle(5);                     // 最小空闲连接数  默认:0
        ds.setInitialSize(8);                 // 连接池启动时创建的初始化连接数量  默认:0
        // 注意: setConnectionProperties()方法要求传入以分号分割的配置信息字符串,然而测试写在此处并没有什么用
        // 所以:使用配置文件时,还是用 工厂类 的方法创建

    }
	// 获取连接的方法
    public static Connection getConnection(){
        try {
            return ds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
	// 归还连接的方法
    public static void close(AutoCloseable c){
        if(null!=c){
            try {
                c.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

DBCP工具类(使用 properties文件 配置):

public class DBCPUtils {
    private DBCPUtils(){}    
    // 配置文件 的 资源路径  推荐使用配置文件,耦合性低,符合开闭原则
    public static final String path = "/dbcp.properties";
    private static BasicDataSource ds;
    static {
        // 使用Properties配置文件
        Properties p = new Properties();
        InputStream in = DBCPUtils.class.getResourceAsStream(path);
        try {
            p.load(in);
            ds = BasicDataSourceFactory.createDataSource(p);   // 工厂方法创建数据源
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

	// 获取连接的方法
    public static Connection getConnection(){
        try {
            return ds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
	// 归还连接的方法
    public static void close(AutoCloseable c){
        if(null!=c){
            try {
                c.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

jdbc.properties 文件,放置在src或resource目录下:

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/lianxi01?characterEncoding=utf-8&serverTimezone=UTC
username=root
password=123456

maxTotal=20
maxIdle=10
minIdle=5
initialSize=8

3. C3P0连接池

3.1 简介

C3P0是一个开源的JDBC连接池,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、 Spring等。

3.2 导入 jar 包

下载网址:https://sourceforge.net/projects/c3p0/

下载后将其中 lib 目录下的三个 jar 包全部导入即可:

常用数据库连接池_bc_02

3.3 C3P0配置

1. 基于 setXxx 配置

public static ComboPooledDataSource ds;
static {
    ds = new ComboPooledDataSource();
    try {
        ds.setDriverClass("com.mysql.cj.jdbc.Driver");
        ds.setJdbcUrl("jdbc:mysql://localhost:3306/lianxi01?characterEncoding=utf-8&serverTimezone=UTC");
        ds.setUser("root");
        ds.setPassword("123456");

        ds.setInitialPoolSize(3);
        ds.setMaxPoolSize(10);
        ds.setMinPoolSize(3);
        ds.setAcquireIncrement(3);
    } catch (PropertyVetoException e) {
        e.printStackTrace();
    }
}

2. 使用配置文件

配置文件名称必须为:c3p0-config.xml 内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!--默认配置-->
    <default-config>
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/lianxi01?characterEncoding=utf-8&serverTimezone=UTC</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <!-- initialPoolSize:初始化时获取三个连接,
        取值应在minPoolSize与maxPoolSize之间。 -->
        <property name="initialPoolSize">3</property>
        <!-- maxIdleTime:最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。-->
        <property name="maxIdleTime">60</property>
        <!-- maxPoolSize:连接池中保留的最大连接数 -->
        <property name="maxPoolSize">100</property>
        <!-- minPoolSize: 连接池中保留的最小连接数 -->
        <property name="minPoolSize">10</property>
    </default-config>
    <!--配置连接池mysql-->
    <named-config name="mysql">
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/lianxi01?characterEncoding=utf-8&serverTimezone=UTC</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>
    </named-config>
    <!--配置连接池2,可以配置多个-->
</c3p0-config>

注意: jdbcUrl中有多个参数时使用&连接,但XML文件中&是转义字符,&amp;amp; 才表示 & 字符。

使用:

public static ComboPooledDataSource ds = new ComboPooledDataSource("mysql");
// 这里的 mysql 是配置文件中 named-config 的 name 属性给定的值。 
// 不写参数时表示使用默认配置<default-config>

3. 常用配置参数

参数

含义

driverClass

数据库驱动类

jdbcUrl

数据库连接地址

user

登录 用户名

password

用户 密码



initialPoolSize

初始化连接数,取值应在minPoolSize与maxPoolSize之间。 默认: 3

maxIdleTime

最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃。 默认: 0

maxPoolSize

最大连接数 默认:15

minPoolSize

最小连接数 默认:10

目前还没有经历过需要配置这些的场景,不好深究,等用到了再说吧。

https://blog.csdn.net/zhanghanlun/article/details/80918422

4. Druid连接池

4.1 简介

Druid(德鲁伊)是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前最好的数据库连接池。在功 能、性能、扩展性方面,都超过其他数据库连接池,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行 情况。

4.2 导入 jar 包

下载网址:https://repo1.maven.org/maven2/com/alibaba/druid/ 可能会比较慢。

下载对应 jar 包,并导入即可。没有什么依赖。

4.3 配置使用方式

可以通过properties文件进行配置,与DBCP的配置方式极其相似。

Druid工具类:

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class DruidUtils {
    private DruidUtils(){}
    private static DataSource ds;
    // 创建数据源
    static{
        InputStream in = DruidDataSource.class.getResourceAsStream("/dbcp.properties");
        Properties p = new Properties();
        try {
            p.load(in);
            ds = DruidDataSourceFactory.createDataSource(p);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 获取连接
    public static Connection getConnection(){
        try {
            return ds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    // 关闭连接
    public static void close(AutoCloseable c){
        if(null!=c){
            try {
                c.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

配置文件:

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/lianxi01?characterEncoding=utf-8&serverTimezone=UTC
username=root
password=123456

initialSize=5     
maxActive=10
# 不是使用maxIdle,而是想c3p0一样指定最长等待时间
maxWait=3000