高并发系统:池化技术-数据库连接池

数据库连接池与系统线程池不同,数据库连接池并不控制应用端和数据库端的线程池的大小。而且每个数据库连接池的配置只是针对自己所在的应用服务进程,限制的是同一个进程内可以访问数据库的并行线程数目。

数据库连接池好处

  • 节省了创建数据库连接的时间,通常这个时间大大超过处理数据访问请求的时间。
  • 统一管理数据库请求连接,避免了过多连接或频繁创建/删除连接带来的性能问题。
  • 监控了数据库连接的运行状态和错误报告,减少了应用服务的这部分代码。
  • 可以检查和报告不关闭数据库连接的错误,帮助运维监测数据库访问阻塞和帮助程序员写出正确数据库访问代码。

连接池优化策略

做为应用服务和数据库的桥梁,连接池参数配置的目标是全局优化。具体的优化目的有四个:

  1. 尽可能满足应用服务的并发数据库访问
    所有需要访问数据库的线程都可以得到需要的数据库连接。如果一个线程用到多个连接,那么需要的连接数目也会成倍增加。这时,需要的连接池最大尺寸应该是最大的并发数据库访问线程数目乘以每个线程需要的连接数目。
  2. 不让数据库服务器过载
    可能有多个应用服务器的多个连接池会同时发出请求。
  3. 能发现用了不还造成的死锁
    应用程序错误会造成借了不还的情况,反复出现会造成连接池用完应用长期等待甚至死锁的状态。需要有连接借用的超时报错机制,而这个超时时间取决于具体应用。
  4. 不浪费系统资源。
    配置过大的连接池会浪费应用服务器的系统资源,包括内存,网络端口,同步信号等。同时线程池的重启和操作都会响应变慢。不过应用端连接池的开销不是很大,资源的浪费通常不是太大问题。

核心参数配置

此处以Spring默认数据库连接池HikariCP为例:

  • **maximum-pool-size:**连接池中最大连接数(包括空闲和正在使用的连接)默认值是10,这个一般预估应用的最大连接数,后期根据监测得到一个最大值的一个平均值。要知道,最大连接并不是越多越好,一个connection会占用系统的带宽和存储。但是 当连接池没有空闲连接并且已经到达最大值,新来的连接池请求(HikariPool#getConnection)会被阻塞直到connectionTimeout(毫秒),超时后便抛出SQLException。
  • **minimum-idle:**池中最小空闲连接数量。默认值10,小于池中最大连接数,一般根据系统大部分情况下的数据库连接情况取一个平均值。Hikari会尽可能、尽快地将空闲连接数维持在这个数量上。如果为了获得最佳性能和对峰值需求的响应能力,我们也不妨让他和最大连接数保持一致,使得HikariCP成为一个固定大小的数据库连接池。
  • **pool-name:**连接池的名字。一般会出现在日志和JMX控制台中。默认值:auto-genenrated。建议取一个合适的名字,便于监控。
  • **auto-commit:**是否自动提交池中返回的连接。默认值为true。一般是有必要自动提交上一个连接中的事务的。如果为false,那么就需要应用层手动提交事务。
  • **idle-timeout:**空闲时间。仅在minimum-idle小于maximum-poop-size的时候才会起作用。默认值10分钟。根据应用实际情况做调整,对于一些间歇性流量达到峰值的应用,一般需要考虑设置的比间歇时间更大,防止创建数据库连接拖慢了应用速度。
  • **max-lifetime:**连接池中连接的最大生命周期。当连接一致处于闲置状态时,数据库可能会主动断开连接。为了防止大量的同一时间处于空闲连接因为数据库方的闲置超时策略断开连接(可以理解为连接雪崩),一般将这个值设置的比数据库的“闲置超时时间”小几秒,以便这些连接断开后,HikariCP能迅速的创建新一轮的连接。
  • **connection-timeout:**连接超时时间。默认值为30s,可以接收的最小超时时间为250ms。但是连接池请求也可以自定义超时时间(com.zaxxer.hikari.pool.HikariPool#getConnection(long))。

连接创建策略

**<minimum-idle:**如果当前连接数小于最小连接数,则创建新的连接处理数据库请求;
如果连接池中有空闲连接则复用空闲连接;
**>minimum-idle,<maximum-pool-size:**如果空闲池中没有连接并且当前连接数小于最大连接数,则创建新的连接处理请求;
**>=maximum-pool-size:**如果当前连接数已经大于等于最大连接数,则按照配置中设定的时间等待旧的连接可用;
如果等待超过了这个设定时间则向用户抛出错误。

参考文章

  1. 数据库连接池设置
  2. HikariCP重要参数配置