池化技术

数据库连接池

数据库的调用方式是先获取数据库的连接,然后依靠这条连接从数据库中查询数据,最后关闭连接释放数据库资源。这种调用方式下,每次执行 SQL 都需要重新建立连接,频繁地建立数据库连接是很耗费时间的

这个时候就需要用到池化技术:建立数据库连接池。

数据库连接池有两个最重要的配置:最小连接数和最大连接数

  • 最小连接数:是连接池一直保持的数据库连接
  • 最大连接数:是连接池能申请的最大连接数

从连接池中获取连接的相关策略:

  • 如果当前连接数小于最小连接数,则创建新的连接处理数据库请求,保证池中的最小连接数;
  • 如果当前连接数大于最小连接数小于最大连接数
    • 如果连接池中有空闲连接则复用空闲连接;
    • 没有则创建新的连接处理请求;
  • 如果当前连接数已经大于等于最大连接数,则按照配置中设定的时间(C3P0 的连接池配置是 checkoutTimeout)等待旧的连接可用
    • 如果等待超过了这个设定时间则向用户抛出错误。

会遇到的问题:

连接断开问题:

  • 数据库的域名对应的 IP 发生了变更,池子的连接还是使用旧的 IP。
  • MySQL 有个参数是“wait_timeout”,控制着当数据库连接闲置多长时间后,数据库会主动地关闭这条连接。

解决方案:

  • 进行定期检测连接问题:

    启动一个线程来定期检测连接池中的连接是否可用,比如使用连接发送“select 1”的命令给数据库看是否会抛出异常,如果抛出异常则将这个连接从连接池中移除,并且尝试关闭。(目前 C3P0 连接池可以采用这种方式来检测连接是否可用,也是比较推荐的)

  • 在使用连接上进行校验,可用再执行SQL(比如 DBCP 连接池的 testOnBorrow 配置项)。

一般在线上建议最小连接数控制在 10 左右,最大连接数控制在 20~30 左右即可。