数据库连接池

  • 子曰:温故而知新,可以为师矣,哈哈装个文雅书生,还望各位莫要见笑呀~
  • 今天就来复习一下 数据库连接池(Database Connection Pooling),好,那么一步一步来:

首先理解"池"

  • 举个栗子
    如果你喝水,你可以拿杯子去水龙头接。如果很多人喝水,那就只能排队去接。
    现在有了池,每个人到池里舀一杯就好,省去了等着水龙头出水的时间。
  • 正式一点的解释:
    池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销。这里所说的池是一种广义上的池,比如数据库连接池、线程池、内存池、对象池等。其中,对象池可以看成保存对象的容器,在进程初始化时创建一定数量的对象。需要时直接从池中取出一个空闲对象,用完后并不直接释放掉对象,而是再放到对象池中以方便下一次对象请求可以直接复用。其他几种池的设计思想也是如此,池技术的优势是,可以消除对象创建所带来的延迟,从而提高系统的性能

那么数据库连接池是什么呢?

  • 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。 ------ 百度百科
    • 图解:
      在这里插入图片描述

数据库连接池存在的意义是什么呢?

换句话说,为什么要使用数据库连接池呢

数据库连接是一种关键、有限且昂贵的资源,创建和释放数据库连接是一个很耗时的操作,频繁地进行这样的操作将占用大量的性能开销,进而导致网站的响应速度下降,严重的时候可能导致服务器崩溃;数据库连接池可以节省系统许多开销

  • 现在我们知道了数据库连接池的基本含义,(大概理解就行),我们继续带着问题来学习
  • 1.有哪些数据库连接池呢
  • 2.怎么用呢
  • 3.谈一谈区别
  • 暂时想到了这些 以后要是想起来了过来补…

常见(用)的数据库连接池

  • DBCP (Database Connection Pool)
  • C3P0
  • DRUID
DBCP
  • 简介: DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。
  • 实例:
    我这里拿Maven项目来说!
    • 1.在pom文件中导入jar包,因为我们这里测试用到了数据库 所以也需要导入数据库的包
          <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>8.0.22</version>
          </dependency>
          <dependency>
              <groupId>commons-dbcp</groupId>
              <artifactId>commons-dbcp</artifactId>
              <version>1.4</version>
          </dependency>
          <dependency>
              <groupId>commons-pool</groupId>
              <artifactId>commons-pool</artifactId>
              <version>1.6</version>
          </dependency>
      
    • 2.编写配置文件 dbcp.properties
          driverClassName=com.mysql.cj.jdbc.Driver
      	url=jdbc:mysql://127.0.0.1:3306/text1?serverTimezone=Asia/Shanghai
      	username=root
      	password=***(写你自己的数据库的密码 注意:没有密码的话不填!,而不是写一个null)
      
    • 3.编写DBCPUtil工具类
      这是一个直接粘贴下来就可以用的封装类 暴力Ctrl+C
      import org.apache.commons.dbcp.BasicDataSourceFactory;
      
      import javax.sql.DataSource;
      import java.io.FileInputStream;
      import java.io.FileNotFoundException;
      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 DBCPUtil {
          public static DataSource ds = null;
      
          static {
              try {
                  //加载配置文件
                  Properties pro = new Properties();
                  InputStream inputStream = null;
                  //inputStream = new FileInputStream("resources/jdbc.properties");
                  inputStream = DBCPUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
                  pro.load(inputStream);
                  ds = BasicDataSourceFactory.createDataSource(pro);
              } catch (FileNotFoundException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }catch (Exception e) {
                  e.printStackTrace();
              }
          }
      
          public static Connection getConnection() {
              try {
                  return ds.getConnection();
              }
              catch (SQLException e){
                  e.printStackTrace() ;
              }
              return null;
          }
      
          public static void close(Statement st, Connection conn, ResultSet rs){
              if (st!=null){
                  try {
                      st.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
              if (conn!=null){
                  try {
                      conn.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
              if (rs!=null){
                  try {
                      rs.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
          }
      }
      
      
    • 4.编写DBCPPropertiesDemo类来测试一下
      import com.buba.util.DBCPUtil;
      
      import java.sql.Connection;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.sql.Statement;
      
      public class DBCPPropertiesDemo {
         public static void main(String[] args) {
             Connection connection =null;
             Statement statement = null;
             ResultSet resultSet = null;
             connection = DBCPUtil.getConnection();//通过读取properties文件的形式得到的连接
             try {
                 statement = connection.createStatement();
                 String sql = "select * from login";
                 resultSet = statement.executeQuery(sql);
                 while(resultSet.next()){
                     System.out.println("username"+resultSet.getString("username"));
                 }
             } catch (SQLException e) {
                 e.printStackTrace();
             }finally {
                 DBCPUtil.close(statement,connection,resultSet);
             }
         }
      }
      
      再附上一张我的项目结构图:
      在这里插入图片描述

DBCP这一部分呢,我在网上找了很多都没有具体的一步一步的例子,这是我在B站跟着这位老师的视频敲出来的
附上链接 Biu~

C3P0
  • 简介:C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。
    • 通俗来讲:也是属于数据库连接池的一种,都是为了减少资源浪费!
  • 实例:
    1. 第一步在pom文件中添加依赖
          <dependency>
             <groupId>c3p0</groupId>
             <artifactId>c3p0</artifactId>
             <version> 0.9.1.2</version>
         </dependency>
      
    2. 在resources文件下添加配置文件
      注意:这里的配置文件的名字最好写成c3p0-config.xml,不然可能识别不到
      <?xml version="1.0" encoding="utf-8"?>
        <c3p0-config>
            <!-- 使用默认的配置读取连接池对象 -->
            <default-config>
                <!--  连接参数 -->
                <property name="driverClass">com.mysql.jdbc.Driver</property>
                <property name="jdbcUrl">jdbc:mysql://localhost:3306/text1</property>
                <property name="user">root</property>
                <property name="password">root</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.cj.jdbc.Driver</property>
                <property name="jdbcUrl">jdbc:mysql://localhost:3306/text1</property>
                <property name="user">root</property>
                <property name="password">root</property>
      
                <!-- 连接池参数 -->
                <property name="initialPoolSize">5</property>
                <property name="maxPoolSize">8</property>
                <property name="checkoutTimeout">1000</property>
            </named-config>
        </c3p0-config>
      
    3. 编写启动类测试一下
        package com.buba.JDBC;
      
        import com.mchange.v2.c3p0.ComboPooledDataSource;
      
        import javax.sql.DataSource;
        import java.sql.Connection;
        import java.sql.SQLException;
      
        public class C3P0Demo1 {
            public static void main(String[] args) throws SQLException {
                //创建数据库连接池连接对象
                DataSource ds = new ComboPooledDataSource();
                //获取连接对象
                Connection connection = null;
                connection = ds.getConnection();
                //3.打印
                System.out.println(connection);
            }
        }
      

      打印输出: com.mchange.v2.c3p0.impl.NewProxyConnection@e73f9ac

  • 测试成功!

附上C3P0的官方文档

Druid
  • 简介:Druid是阿里巴巴的数据源,集合了c3p0、dbcp、proxool等连接池的优点,还加入了日志监控,能有效的监控DB池连接和SQL的执行情况。
    • 说个题外话,druid不仅仅是连接池这么简单,他其他的功能也特别强
  • 在这里就看看它的连接池怎么用:
    1. 添加依赖
      <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>druid</artifactId>
             <version>1.1.2</version>
         </dependency>
      
    2. 编写配置文件
         driverClassName=com.mysql.jdbc.Driver
         url=jdbc:mysql://127.0.0.1:3306/text1
         username=root
         password=root
         initialSize=5
         maxActive=10
         maxWait=3000
      
    3. 编写测试类启动
         import com.alibaba.druid.pool.DruidDataSourceFactory;
      
         import javax.sql.DataSource;
         import java.io.IOException;
         import java.sql.Connection;
         import java.util.Properties;
      
         public class DruidDemo {
             public static void main(String[] args) throws Exception {
                 //1.导入jar包
                 //2.定义配置文件
                 //3.加载配置文件
                 Properties properties = new Properties();
                 properties.load(DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"));
                 //4.获取连接池对象
                 DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
                 //5.获取连接
                 Connection connection = dataSource.getConnection();
                 System.out.println(connection);
             }
         }
      
    4. 测试成功
封装好的工具类这里可以找

本节完

部分内容参考来自以下博主:
https://www.cnblogs.com/eret9616/p/8920407.html

https://blog.csdn.net/weixin_40751299/article/details/81609332

https://blog.csdn.net/y0q2t57s/article/details/82889865

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值