数据库连接池

1. 数据库连接池的概念

数据库连接池就是一个存放数据库连接的容器(集合)。

当系统初始化好后,容器被创建,并且容器中会申请一些连接对象。用户访问数据库可以直接从容器中获取连接对象,访问完再将连接对象归还给容器。

2. 数据库连接池的作用

原先用户访问数据库需要向系统底层申请一个连接对象,访问完再将连接对象归还给系统,而向系统底层申请资源是很耗时的,并且这样每次申请释放对系统资源的浪费很大。

使用数据库连接池后,用户访问数据库可以直接从容器中获取连接对象,访问完再将连接对象归还给容器。用户不再需要耗费申请资源的时间了,使用户访问更高效,而且提高了连接对象的复用率,节约了资源

3. 数据库连接池的实现

  1. javax.sql 包下提供了 DataSource 接口,这个接口由数据库厂商去实现,所有的数据库连接池都会实现 DataSource 接口。

    DataSource 接口中的方法:

    1. 获取连接:

      Connection getConnection()
      
    2. 归还连接:

      如果连接对象 Connection 是从连接池中获取的,那么调用 Connection 的 close() 方法,则不会再关闭连接了,而是归还连接给数据库连接池。

  2. 常用的数据库连接池

    1. C3P0:开源的数据库连接池,它实现了数据源和 JNDI 绑定,支持 JDBC3 规范和 JDBC2 的标准扩展。目前使用它的开源项目有 Hibernate ,Spring 等。
    2. Druid:阿里巴巴提供的开源数据库连接池

4. C3P0 数据库连接池

  1. C3P0 的使用步骤

    1. 在 src 下创建 libs 文件夹

    2. 在 libs 中导入数据库驱动 jar 包,右键 Add as Library

      • mysql-connector-java-5.1.37-bin.jar
    3. 在 libs 中导入 C3P0 的两个 jar 包,右键 Add as Library

      • c3p0-0.9.5.2.jar
      • mchange-commons-java-0.2.12.jar
    4. 定义 C3P0 配置文件

      名称: c3p0.properties 或者 c3p0-config.xml

      路径:直接将文件放在 src 下即可

    5. 创建 C3P0 数据库连接池对象

      // 使用默认的配置读取连接池对象
      ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
      // 使用指定名称的配置读取连接池对象
      ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("指定的名称");
      
    6. 获取连接对象

      Connection connection = comboPooledDataSource.getConnection();
      
  2. c3p0-config.xml

    <c3p0-config>
      <!-- 使用默认的配置读取连接池对象 -->
      <default-config>
      	<!--  连接参数 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test1</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        
        <!-- 连接池参数 -->
        <!-- 初始化申请的连接数量,如果都用完了再申请 -->
        <property name="initialPoolSize">5</property>
        <!-- 最大的连接数量,最多只能申请这么多连接对象 -->
        <property name="maxPoolSize">10</property>
        <!-- 超时时间,超过这个时间申请不到连接对象就报错 -->
        <property name="checkoutTimeout">3000</property>
      </default-config>
    
      <!-- 使用指定名称的配置读取连接池对象 -->
      <named-config name="otherc3p0"> 
        <!--  连接参数 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test1</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        
        <!-- 连接池参数 -->
        <!-- 初始化申请的连接数量,如果都用完了再申请 -->
        <property name="initialPoolSize">5</property>
        <!-- 最大的连接数量,最多只能申请这么多连接对象 -->
        <property name="maxPoolSize">8</property>
        <!-- 超时时间,超过这个时间申请不到连接对象就报错 -->
        <property name="checkoutTimeout">1000</property>
      </named-config>
    </c3p0-config>
    

5. Druid 数据库连接池

  1. Druid 的使用步骤

    1. 在 src 下创建 libs 文件夹

    2. 在 libs 中导入数据库驱动 jar 包,右键 Add as Library

      • mysql-connector-java-5.1.37-bin.jar
    3. 在 libs 中导入 Druid 的 jar 包,右键 Add as Library

      • druid-1.0.9.jar
    4. 定义 Druid 配置文件

      名称:xxx.properties

      路径:可以放在任意目录下(直接将文件放在 src 下也行)

    5. 加载 Druid 配置文件(与 C3P0 不同,Druid 配置文件需要手动加载)

      // 加载配置文件
      Properties properties = new Properties();
      InputStream resourceAsStream = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties");
      properties.load(resourceAsStream);
      
    6. 创建 Druid 数据库连接池对象(通过工厂类来创建)

      DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
      
    7. 获取连接对象

      Connection connection = dataSource.getConnection();
      
  2. druid.properties

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/test1
    username=root
    password=123456
    initialSize=5
    maxActive=10
    maxWait=3000
    
  3. 定义工具类 JDBCUtils

    1. JDBCUtils 的作用

      提供获取连接池,获取连接对象,释放资源等方法,简化 JDBC 的使用

    2. JDBCUtils 的功能

      1. 获取连接池
      2. 通过数据库连接池获取连接对象
      3. 释放资源
    3. 编码实现

      package com.zt.datasource.utils;
      
      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.ResultSet;
      import java.sql.SQLException;
      import java.sql.Statement;
      import java.util.Properties;
      
      public class JDBCUtils {
          // 1.定义静态变量 dataSource
          private static DataSource dataSource;
          static {
              try {
                  // 2.加载配置文件
                  Properties properties = new Properties();
                  InputStream resourceAsStream = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
                  properties.load(resourceAsStream);
                  // 3.创建数据库连接池对象,并赋值给 dataSource
                  dataSource = DruidDataSourceFactory.createDataSource(properties);
              } catch (IOException e) {
                  e.printStackTrace();
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      
          /**
           * 获取连接池方法
           */
          public static DataSource getDataSource(){
              return dataSource;
          }
      
          /**
           * 通过数据库连接池获取连接对象
           */
          public static Connection getConnection() throws SQLException {
              return dataSource.getConnection();
          }
      
          /**
           * 释放资源
           */
          public static void close(ResultSet resultSet, Statement statement,Connection connection) {
              if(resultSet != null){
                  try {
                      resultSet.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
              if(statement != null){
                  try {
                      statement.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
              if(connection != null){
                  try {
                      connection.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
          }
      
          public static void close(Statement statement,Connection connection) {
              close(null,statement,connection);
          }
      
      
      }
      
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bm1998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值