Skip to content

连接池介绍

没有连接池的现状

  1. 之前 JDBC 访问数据库的步骤: 创建数据库连接运行SQL语句关闭连接 每次数据库访问执行这样重复的动作

  2. 每次创建数据库连接的问题

    • 获取数据库连接需要消耗比较多的资源,而每次操作都要重新获取新的连接对象,执行一次操作就把连接关闭,而数据库创建连接通常需要消耗相对较多的资源,创建时间也较长。这样数据库连接对象的使用率低。
    • 假设网站一天 10 万访问量,数据库服务器就需要创建 10 万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出

我们现实生活中每日三餐。我们并不会吃一餐饭就将碗丢掉,而是吃完饭后将碗放到碗柜中,下一餐接着使用。目的是重复利用碗,我们的数据库连接也可以重复使用,可以减少数据库连接的创建次数。提高数据库连接对象的使用率。

连接池的概念: 连接池是创建和管理数据库连接的缓冲池技术。连接池就是一个容器,连接池中保存了一些数据库连接,这些连接是可以重复使用的。

连接池解决现状问题的原理

  1. 程序一开始就创建一定数量的连接,放在一个容器中,这个容器称为连接池(相当于碗柜/容器)。
  2. 使用的时候直接从连接池中取一个已经创建好的连接对象。
  3. 关闭的时候不是真正关闭连接,而是将连接对象再次放回到连接池中。

连接池好处

连接池中保存了一些数据库连接,这些连接是可以重复使用的。节省数据库的资源消耗。

常用连接池的介绍

javax.sql.DataSource表示数据库连接池,是 JDK 中提供的一个接口,没有具体的实现,它的实现由连接池的数据库厂商去实现。我们只需要学习这个工具如何使用即可。

java
public interface DataSource {
    Connection getConnection();
}

常用的连接池实现组件有以下这些:

  1. 阿里巴巴-德鲁伊 Druid 连接池:Druid 是阿里巴巴开源平台上的一个项目
  2. C3P0 是一个开源的 JDBC 连接池,目前使用它的开源项目有 Hibernate,Spring 等。
  3. DBCP(DataBase Connection Pool)数据库连接池,是 Apache 上的一个 Java 连接池项目,也是 Tomcat 使用的连接池组件。

小结

  1. 连接池的好处?

    连接池内部会保存好一些连接,这些连接可以反复使用,提高连接的使用率,降低数据库资源消耗

  2. 连接池的原理?

    1. 创建连接池时,连接池内部就会创建一些连接
    2. 当需要使用连接时,就直接从连接池里面取出连接
    3. 当连接使用完毕时,重新放回连接池

C3P0连接池

C3P0连接池简介

C3P0 是一个开源的连接池。Hibernate 框架,默认推荐使用 C3P0 作为连接池实现。

C3P0 地址:https://sourceforge.net/projects/c3p0/?source=navbar

快速入门

  • c3p0.xml

    注意

    • IDEA项目

      将c3p0.xml放到src目录中

    • Web项目

      将c3p0.xml放到web/WEB-INF目录中

    • Maven项目

      将c3p0.xml到src/main/resources目录中

    xml
    <c3p0-config>
      <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/${db_name}</property>
        <property name="user">${db_username}</property>
        <property name="password">${db_password}</property>
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">10</property>
        <property name="checkoutTimeout">2000</property>
        <property name="maxIdleTime">1000</property>
      </default-config>
    </c3p0-config>
  • C3P0Practice.java

    java
    public class C3P0Practice {
        public static void main(String[] args) throws Exception {
            // 1. 创建连接池
            ComboPooledDataSource ds = new ComboPooledDataSource();
    
            // 2. 获取连接对象
            Connection connection = dataSource.getConnection();
    
            // 3. 创建statement对象
            PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM emp");
    
            // 4. 执行sql语句
            ResultSet resultSet = pstmt.executeQuery();
    
            // 5. 处理结果集
            while(resultSet.next()) {
                System.out.println(resultSet.getString("empno"));
                System.out.println(resultSet.getString("ename"));
                System.out.println(resultSet.getString("job"));
                System.out.println("----------");
            }
    
            // 6. 关闭资源
            resultSet.close();
            pstmt.close();
            connection.close();
        }
    }

Druid连接池

Druid连接池简介

Druid 是阿里巴巴开发的号称为监控而生的数据库连接池,Druid 是目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池,同时加入了日志监控,可以很好的监控 DB 池连接和 SQL 的执行情况。Druid 已经在阿里巴巴部署了超过 600 个应用,经过一年多生产环境大规模部署的严苛考验。

Druid 地址:https://github.com/alibaba/druid

快速入门

  • druid.properties

    注意

    • IDEA项目

      将druid.properties放到src目录中

    • Web项目

      将druid.properties放到web/WEB-INF目录中

    • Maven项目

      将druid.properties放到src/main/resources目录中

    properties
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/day25
    username=root
    password=root
    initialSize=5
    maxActive=10
    maxWait=3000
  • DruidPractice.java

    java
    package com.futureweaver;
    
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    import javax.sql.DataSource;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.Properties;
    
    public class DruidPractice {
        public static void main(String[] args) throws Exception {
            // 1. 创建连接池
            InputStream is = ClassLoader.getSystemResourceAsStream("druid.properties");
            Properties properties = new Properties();
            properties.load(is);
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
    
            // 2. 获取连接对象
            Connection connection = dataSource.getConnection();
    
            // 3. 创建statement对象
            PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM emp");
    
            // 4. 执行sql语句
            ResultSet resultSet = pstmt.executeQuery();
    
            // 5. 处理结果集
            while(resultSet.next()) {
                System.out.println(resultSet.getString("empno"));
                System.out.println(resultSet.getString("ename"));
                System.out.println(resultSet.getString("job"));
                System.out.println("----------");
            }
    
            // 6. 关闭资源
            resultSet.close();
            pstmt.close();
            connection.close();
        }
    }

Idea模板

  1. 进入 Idea 欢迎页面,左侧导航栏,选择Customize,选择All Settings...
  2. 如果已开启某个项目,点击菜单栏-File-Close Project
  3. 左侧导航栏,选择Editor->File And Code Templates

c3p0.xml

  1. 右侧视图,选择Files选项卡
  2. 点击+
  3. Name -> c3p0.xml
  4. Extention -> xml
  5. File Name -> c3p0.xml
  6. 将以下内容,粘贴到模板内部
xml
<c3p0-config>
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/${db_name}</property>
    <property name="user">${db_username}</property>
    <property name="password">${db_password}</property>
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">10</property>
    <property name="checkoutTimeout">2000</property>
    <property name="maxIdleTime">1000</property>
  </default-config>
</c3p0-config>

druid.properties

  1. 右侧视图,选择Files选项卡
  2. 点击+
  3. Name -> druid.properties
  4. Extention -> properties
  5. File Name -> druid.properties
  6. 将以下内容,粘贴到模板内部
properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/${db_name}?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
username=${db_username}
password=${db_password}
# 初始化connection数量
initialSize=10
# 最大连接数量
maxActive=50
# 最小空闲数量
minIdle=5
# 等待时间
maxWait=5000

课程目标总结

  • 能够理解连接池解决现状问题的原理
  • 能够使用 C3P0 连接池
  • 能够使用 DRUID 连接池