2. 第三方连接池

2021-10-12 16:16:34 浏览数 (1)

2. 第三方连接池

前言

在前面的章节中,我们虽然写了下自定义连接池,但是那只是为了更好理解连接池原理而已。在真正的工作中,我们使用最多的还是第三方连接池。

常用连接池

常见的第三方连接池如下:

  • C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0是异步操作的,所以一些操作时间过长的JDBC通过其它的辅助线程完成。目前使用它的开源项目有Hibernate,Spring等。C3P0有自动回收空闲连接功能
  • 阿里巴巴-德鲁伊druid连接池:Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求。
  • DBCP(DataBase Connection Pool)数据库连接池,是Apache上的一个Java连接池项目,也是Tomcat使用的连接池组件。dbcp没有自动回收空闲连接的功能。

下面我们专门来讲解一下 C3P0 和 德鲁伊druid连接池 即可。

C3P0 的基本使用

1. 介绍

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

在常见的开发中,一般都是下载 jar 包导入依赖,那么在这里呢。我采用 Maven 下载 jar 包依赖,但是还是要下载一下 C3P0 的项目,因为还需要看看里面的说明文档。

2.说明文档的下载

https://sourceforge.net/settings/mirror_choices?projectname=c3p0&filename=c3p0-bin/c3p0-0.9.5.5/c3p0-0.9.5.5.bin.zip&selected=udomain

image-20201027215831774

下载好 zip 包如下:

image-20201027220821109

解压文件,如下:

image-20201027221118721

C3P0 的 jar 包 :

image-20201027231850014

那么下面我在项目中使用 maven 来设置 C3P0 的依赖。

3.使用 maven 设置 C3P0 的依赖

访问 https://mvnrepository.com/

3.1 搜索 c3p0 依赖

image-20210126080304523

image-20210126080321279

代码语言:javascript复制
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.5</version>
</dependency>
3.2 搜索 mchange-commons 依赖

image-20210126080603753

image-20210126080717375

代码语言:javascript复制
<!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java -->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>mchange-commons-java</artifactId>
    <version>0.2.20</version>
</dependency>
3.3 在项目的 pom.xml 配置依赖

image-20210126080917398

代码语言:javascript复制
    <!--  设置依赖  -->
    <dependencies>
        <!--  按下 alt   insert 搜索依赖      -->
        <!--  C3P0依赖      -->
        <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>mchange-commons-java</artifactId>
            <version>0.2.20</version>
        </dependency>
        <!--  mysql连接依赖      -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
        <!--  注入junit依赖      -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

4. 查看开发文档,快速入门示例

示例代码以及配置文件:

image-20201027221701487

查看开发文档:

image-20201027221827398

image-20201027221850254

image-20201027221933416

5. 实现方式一:根据快速入门示例,实现数据库连接池

代码语言:javascript复制
//方式一:
@Test
public void test01() throws Exception {
    //1.获取c3p0数据库连接池
    ComboPooledDataSource cpds = new ComboPooledDataSource();
    cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver
    cpds.setJdbcUrl( "jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false" );
    cpds.setUser("root"); // 设置访问的用户
    cpds.setPassword("L******************0"); // 设置访问的密码

    //通过设置相关的参数,对数据库连接池进行管理:
    //设置初始时数据库连接池中的连接数
    cpds.setInitialPoolSize(10);
    //获取连接池的数据库连接
    Connection conn = cpds.getConnection();
    System.out.println(conn);

    //销毁c3p0数据库连接池【一般不操作】
    //cpds.close();
}

测试执行如下:

image-20210126081538484

好了,到了这里。我们就已经知道的第一种创建的方式。当然,还有第二种方式,上面我们的参数都是固定写在代码中,应该将其抽离出来,写在配置文件中。

6. 查看开发文档,使用配置文件的方式来创建数据库连接池

image-20201027233628769

image-20201027233851275

7. 实现方式二:使用配置文件的方式,创建连接

1. 在项目的目录下,创建配置文件:c3p0-config.xml

image-20210126083450247

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

    <named-config name="hellc3p0">
        <!-- 提供获取连接的4个基本信息 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
        <property name="user">root</property>
        <property name="password">***********</property>

        <!-- 进行数据库连接池管理的基本信息 -->
        <!-- 当数据库连接池中的连接数不够时,c3p0一次性向数据库服务器申请的连接数 -->
        <property name="acquireIncrement">5</property>
        <!-- c3p0数据库连接池中初始化时的连接数 -->
        <property name="initialPoolSize">10</property>
        <!-- c3p0数据库连接池维护的最少连接数 -->
        <property name="minPoolSize">10</property>
        <!-- c3p0数据库连接池维护的最多的连接数 -->
        <property name="maxPoolSize">100</property>
        <!-- c3p0数据库连接池最多维护的Statement的个数 -->
        <property name="maxStatements">50</property>
        <!-- 每个连接中可以最多使用的Statement的个数 -->
        <property name="maxStatementsPerConnection">2</property>

    </named-config>
</c3p0-config>
2.创建数据库连接池
代码语言:javascript复制
//方式二:使用配置文件
@Test
public void testGetConnection1() throws SQLException {
    ComboPooledDataSource cpds = new ComboPooledDataSource("hellc3p0");
    Connection conn = cpds.getConnection();
    System.out.println(conn);
}

测试执行如下:

image-20210126083709840

8. 使用c3p0改写工具类

代码语言:javascript复制
/**
 * @author Aron.li
 * @date 2020/10/27 23:51
 */
public class JDBCUtils {

    /**
     *
     * @Description 使用C3P0的数据库连接池技术
     * @author shkstart
     * @date 下午3:01:25
     * @return
     * @throws SQLException
     */
    //数据库连接池只需提供一个即可。
    private static ComboPooledDataSource cpds = new ComboPooledDataSource("hellc3p0");
    public static Connection getConnection() throws SQLException{
        Connection conn = cpds.getConnection();
        return conn;
    }
    
}

在这里注意使用 static 定义连接池,因为连接池只需要有一个即可。

DRUID

1. DRUID介绍

Druid是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是国内目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池。Druid已经在阿里巴巴部署了超过600个应用,经过很久生产环境大规模部署的严苛考验。如:一年一度的双十一活动,每年春运的抢火车票

Druid的下载地址:https://github.com/alibaba/druid

DRUID连接池使用的jar包:druid-1.0.9.jar

img

2. 使用 maven 设置 druid 的依赖

2.1 搜索依赖

访问 https://mvnrepository.com/ 搜索 druid

image-20210126110446558

image-20210126110515728

image-20210126110528650

代码语言:javascript复制
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.4</version>
</dependency>
2.2 在项目的 pom.xml 配置依赖

image-20210126110713396

代码语言:javascript复制
    <!--  设置依赖  -->
    <dependencies>
        <!--  按下 alt   insert 搜索依赖      -->
        <!--  druid依赖      -->
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.4</version>
        </dependency>
        <!--  mysql连接依赖      -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
        <!--  注入junit依赖      -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

3. DRUID的使用

3.1通过硬编码方式【了解】

步骤:

  1. 在 Maven 设置 DRUID jar 包
  2. 创建Druid连接池对象, 配置4个基本参数
  3. 从Druid连接池对象获得Connection

实现:

image-20210126111236347

代码语言:javascript复制
    @Test
    public void test01() throws SQLException {

        //1. 创建DataSource
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");//设置驱动
        dataSource.setUrl("jdbc:mysql://localhost:3306/test");//设置数据库路径
        dataSource.setUsername("root");//设置用户名
        dataSource.setPassword("L****************0");//设置密码

        dataSource.setInitialSize(5);//设置初始化连接的数量


        //2. 从数据源里面获得Connection
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
    }
3.2 通过配置文件方式【重点】

步骤:

  1. 在 Maven 设置 DRUID jar 包
  2. 拷贝配置文件到src目录
  3. 根据配置文件创建Druid连接池对象
  4. 从Druid连接池对象获得Connection

实现:

  • 创建druid.properties, 放在resources目录下

image-20210126111742287

代码语言:javascript复制
url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
username=root
password=Li****************0
driverClassName=com.mysql.jdbc.Driver

initialSize=10
maxActive=10
  • 编写Java代码

image-20210126111817029

代码语言:javascript复制
    @Test
    public void test02() throws Exception {

        //0 根据druid.properties创建配置文件对象
        Properties properties = new Properties();
        // 关联druid.properties文件
        InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
        properties.load(is);
        //1. 创建DataSource
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

        //2. 从数据源(连接池)获得连接对象
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
    }

4. Druid工具类

为了方便调用,我们还可以将连接池的初始化封装一下,设置为静态属性即可。

代码语言:javascript复制
public class DruidUtil {
    private static DataSource dataSource;
    static {
        try {
            //1. 创建Properties对象
            Properties properties = new Properties();
            //2. 将配置文件转换成字节输入流
            InputStream is = DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties");
            //3. 使用properties对象加载is
            properties.load(is);
            //druid底层是使用的工厂设计模式,去加载配置文件,创建DruidDataSource对象
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static DataSource getDataSource(){
        return dataSource;
    }
}

0 人点赞