You need to enable JavaScript to run this app.
导航

关于连接池模式

最近更新时间2024.02.21 11:42:26

首次发布时间2022.09.22 21:38:08

数据库连接池负责分配、管理和释放数据库连接,根据具体的业务场景选择相应的连接池模式,可以提升数据库的性能,提高数据库资源的利用率。云数据库 MySQL 版提供了直连连接池和事务级连接池。

连接池模式介绍

连接池模式模式简介使用场景

事务级连接池(默认)

支持连接复用,减少直连到数据库的连接数,降低短连接较多的场景下频繁建连造成的负载。

  • 大量短连接为主的业务,原生 MySQL 不擅长短连接场景。

  • 连接收敛,支持更高的并发的连接。

直连模式连接池

也称为无连接池模式,Proxy 的连接池将不再进行连接复用,即每次客户端新建连接 Proxy 也会同步新建连接。

  • 长连接为主的业务。

  • 用户应用层支持连接池

  • 需要查询连接状态,比如执行 last_insert_id()

  • 无读写分离下能够保证 FOUND_ROWS() 函数准确性。


使用限制

事务级连接池使用限制

  • 执行以下操作时,连接将被锁定直至连接结束(即该连接不会再被放到连接池里供其他用户连接使用)。

    • 执行 PREPARE 语句或执行 COM_STMT_PREPARE 相关协议。

    • 创建临时表。

    • 修改用户变量。

    • 使用 lock table

    • 多语句。

    • 存储过程调用。

  • 不支持 FOUND_ROWSROW_COUNTLAST_INSERT_ID 函数的调用,这些函数可以调用成功,但是无法保证调用结果的正确性。

  • 对于设置了 wait_timeout 的连接,wait_timeout 在客户端的表现可能不会生效,因为每次请求都会从连接池中获取连接,当 wait_timeout 超时后,只有连接池中的后端连接会断开,而后端连接断开并不会导致客户端连接断开。

  • 除了 sql_modecharacter_set_servercollation_servertime_zone 这四个变量以外,如果业务依赖其他 session 级别的系统变量,那么需要客户端在建连之后显式执行 set 语句,否则连接池可能会复用系统变量已经被更改过的连接。

  • 由于连接可能会被复用,您可以使用 select connection_id() 查询当前连接的 thread id。

  • 由于连接可能会被复用,所以 show processlist 显示的 IP 地址和端口可能和客户端实际的 IP 地址和端口不一致。

  • 数据库代理会将所有节点上的 show processlist 结果合并后返回,在事务级连接池开启后,前端连接和后端连接的 thread id 无法对应。这导致 kill 命令可能会报错,但是实际上 kill 命令已经正常执行成功,可再通过 show processlist 确定相应的连接是否断开。

  • 请勿为同一个数据库账号在不同 IP 下设置不同的权限,可能会导致连接复用时权限出错。例如为 user@192.168.1.1 设置了 database_01 的权限,而 user@192.168.1.2 没有 database_01 的权限,那么在开通连接池时可能会导致权限错误问题。

直连模式连接池使用限制

  • 由于 Proxy 前后端连接不一致,您可以使用 select connection_id() 查询当前连接的 thread id 。

  • 由于 Proxy 前后端连接不一致,所以 show processlist 显示的 IP 地址和端口可能和客户端实际的 IP 地址和端口不一致。

  • 数据库代理会将所有节点上的 show processlist 结果合并后返回,由于当前 Proxy 前端连接和后端连接的 thread id 无法对应。这导致 kill 命令可能会报错,但是实际上kill命令已经正常执行成功,可再通过 show processlist 确定相应的连接是否断开。

连接池模式对比

结构对比

  • 事务级连接池:同一客户端可以使用多个 Proxy 的连接。
  • 直连模式连接池:同一客户端只能使用一个后端连接。

功能对比

直连模式连接池和事务级别连接池大部分功能相同,因为直连模式连接池和用户连接绑定,所以涉及到连接立即更新的功能,这两种连接池模式会有些区别。

功能事务级别连接池直连模式
读写分离支持支持
读写权重支持支持
延迟阈值支持支持
读写分离的故障转移支持支持
控制台修改参数,参数立即生效支持不支持。直连模式需要用户断连后,参数修改才能生效。
连接复用支持不支持