数据库连接池

1. 什么是连接池?

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个新的连接。

2. 为什么要使用连接池?

  1. 新建连接(不用连接池)
    1. 步骤
      • TCP建立的三次握手
      • MYSQL认证的三次握手
      • SQL执行
      • 连接的关闭
      • TCP的四次挥手
    2. 缺点
      • 每一次都要经过以上步骤
      • 网络IO多
      • 数据库的负载较高
      • GC频繁
  2. 使用连接池
    1. 优点
      • 第一次访问的时候,需要建立连接。 之后的访问,会复用之前创建的连接
      • 减少了网络的IO

3. 连接池的主要参数

  1. 最小连接数
  2. 最大连接数
    1. 作用
      • 同一时刻可以同时向数据库申请的连接数
  3. 初始连接数
    1. 作用
      • 连接池的初始连接数的大小
  4. 最小空闲数
    1. 作用
      • 池中空闲连接的最小数量 在数据库连接池空闲状态下,连接池最少保留多少个连接
    2. 特点
      • 当连接数少于此值时,连接池会创建连接来补充到该值的数量
  5. 最大超时时间

4. 使用

  1. DBCP
    1. pom 引入
      
          commons-dbcp
          commons-dbcp
          1.4
      
      
    2. 上实操代码~~~
      import org.apache.commons.dbcp.BasicDataSource;
      
      import javax.sql.DataSource;
      import java.sql.Connection;
      import java.sql.SQLException;
      
      /**
       * @Classname BasicDataSourceTest
       * @Description TODO  org.apache.commons.dbcp.BasicDataSource 连接池
       * @Date 2020/7/9 8:42
       * @Created by light
       */
      public class BasicDataSourceTest {
          public static void main(String[] args) {
              BasicDataSource dataSource = new BasicDataSource();
              dataSource.setDriverClassName("com.mysql.jdbc.Driver");
              dataSource.setUrl("jdbc:mysql://localhost:3306/scott");
              dataSource.setUsername("root");
              dataSource.setPassword("123456");
              // 设置连接池的初始连接数的大小
              dataSource.setInitialSize(3);
              // 设置最大的连接数 同一时刻可以同时向数据库申请的连接数
              dataSource.setMaxActive(10);
              //设置池中空闲连接的最小数量 在数据库连接池空闲状态下,连接池最少保留多少个连接
              dataSource.setMinIdle(2);
      
              for (int i = 0; i < 20; i++) {
                  new Thread(new DataSourceThread(dataSource)).start();
              }
      
          }
      }
      
      /**
       *  用于测试 连接池的 最大连接数
       */
      class DataSourceThread implements Runnable {
          private DataSource dataSource;
      
          public DataSourceThread(DataSource dataSource) {
              this.dataSource = dataSource;
          }
      
          @Override
          public void run() {
              Connection connection = null;
              try {
                  connection = dataSource.getConnection();
                  System.out.println(Thread.currentThread().getName() 
                  + " 获得数据库连接 " + connection);
                  
                  Thread.sleep(10000);
              } catch (Exception throwables) {
                  throwables.printStackTrace();
              } finally {
                  if (connection != null) {
                      try {
                          // 只有当前面的线程释放到连接资源后,新的线程才能获取连接资源
                          //此处的 close 不是关闭,而是归池 如果不归池,那么其他线程就获取不到连接
                          connection.close();
                      } catch (SQLException throwables) {
                          throwables.printStackTrace();
                      }
                  }
              }
      
          }
      }
      
  2. c3p0
    1. pom
        
            com.mchange
            c3p0
            0.9.5.5
        
      
    2. 上Java~~~
      import com.mchange.v2.c3p0.ComboPooledDataSource;
      
      
      /**
       * @Classname MyC3p0DataSourceTest
       * @Description TODO c3p0 连接池的使用
       * @Date 2020/7/9 11:57
       * @Created by light
       */
      public class MyC3p0DataSourceTest {
          public static void main(String[] args) throws Exception{
              ComboPooledDataSource dataSource = new ComboPooledDataSource();
              dataSource.setDriverClass("com.mysql.jdbc.Driver");
              dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/scott");
              dataSource.setUser("root");
              dataSource.setPassword("123456");
              // 初始连接数  池在启动时将尝试获取的连接数。应该在minPoolSize和 maxPoolSize之间,
              dataSource.setInitialPoolSize(3);
              // 最大连接数
              dataSource.setMaxPoolSize(10);
              // 最小连接数
              dataSource.setMinPoolSize(2);
              // 最大空闲时间 单位为 S
              dataSource.setMaxIdleTime(60);
      
              System.out.println(dataSource.getConnection());
      
      
          }
      }
      

你可能感兴趣的:(数据库连接池)