文章目录

  • 1. 什么是数据库连接池?
  • 2. 为什么要使用数据库连接池?
  • 3. 数据库连接池的基本概念
  • 4. 数据库连接池的原理
  • 5. 数据库连接池示例


1. 什么是数据库连接池?

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接泄露。(数据库连接dataSource.getConnection,必须在finally中close,否则不能被回收,从而导致内存泄漏)

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

如果使用数据库连接池,那么对于每一次sql操作,都要走一遍下面的流程:

① TCP建立连接的三次握手(客户端与 MySQL服务器的连接基于TCP协议)
② MySQL认证的三次我收
③ 真正的SQL执行
④ MySQL的关闭
⑤ TCP的四次握手关闭

可以看出来,为了执行一条sql,需要进行大量的初始化与关闭操作。
如果使用数据库连接池的话,那么会事先申请(初始化)好相关的数据库连接,然后在之后的SQL操作中会复用这些数据库连接,操作结束之后数据库也不会断开连接,而是将数据库对象放回到数据库连接池中。

总体而言,有以下好处:

① 资源重用:避免了频繁的创建、释放连接引起的性能开销。
② 更快的系统响应速度:数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。对于业务请求处理而言,直接利用现有可用连接,避免了从数据库连接初始化和释放过程的开销,从而缩减了系统整体响应时间。
③ 避免数据库连接泄露:在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄露。

3. 数据库连接池的基本概念

  • 最小连接数 是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,该值应设置小一点。
  • 最大连接数 是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被阻塞。
  • 最小连接数与最大连接数差距 超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

4. 数据库连接池的原理

连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。

5. 数据库连接池示例

以Druid连接池为例:

# 数据库的相关配置信息
datasource:
	# 表示数据库的连接地址,包括数据库类型、主机、端口号
    url: jdbc:postgresql://localhost:5432/test_db
    username: root
    password: bfXa4Pt2lUUScy8jakXf
    # 指定使用哪种数据源连接池,这里使用的是阿里巴巴的Druid数据源连接池
    type: com.alibaba.druid.pool.DruidDataSource
    # 指定数据库的JDBC驱动程序的类名,这边使用的是PostgreSQL数据库的JDBC驱动程序
    driver-class-name: org.postgresql.Driver
    druid:
      # 连接池中最大的活跃连接数。超过此数量的连接将被等待或抛出异常,根据 max-wait 配置来决定
      max-active: 50
      # 连接池在启动时创建的初始连接数
      initial-size: 10
      # 获取连接时最大的等待时间,单位为毫秒。超时将抛出异常。
      max-wait: 60000
      # 连接池中最小的空闲连接数,低于此数量的连接将被创建。
      min-idle: 10
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true
      max-open-prepared-statements: 100