数据库连接池负责分配、管理和释放数据库连接,根据具体的业务场景选择相应的连接池模式,可以提升数据库的性能,提高数据库资源的利用率。云数据库 MySQL 版提供了直连连接池和事务级连接池。
连接池模式 | 模式简介 | 使用场景 |
---|---|---|
事务级连接池(默认) | 支持连接复用,减少直连到数据库的连接数,降低短连接较多的场景下频繁建连造成的负载。 |
|
直连模式连接池 | 也称为无连接池模式,Proxy 的连接池将不再进行连接复用,即每次客户端新建连接 Proxy 也会同步新建连接。 |
|
执行以下操作时,连接将被锁定直至连接结束(即该连接不会再被放到连接池里供其他用户连接使用)。
执行 PREPARE
语句或执行 COM_STMT_PREPARE
相关协议。
创建临时表。
修改用户变量。
使用 lock table
。
多语句。
存储过程调用。
不支持 FOUND_ROWS
、ROW_COUNT
和LAST_INSERT_ID
函数的调用,这些函数可以调用成功,但是无法保证调用结果的正确性。
对于设置了 wait_timeout
的连接,wait_timeout
在客户端的表现可能不会生效,因为每次请求都会从连接池中获取连接,当 wait_timeout
超时后,只有连接池中的后端连接会断开,而后端连接断开并不会导致客户端连接断开。
除了 sql_mode
、character_set_server
、collation_server
、time_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
确定相应的连接是否断开。
直连模式连接池和事务级别连接池大部分功能相同,因为直连模式连接池和用户连接绑定,所以涉及到连接立即更新的功能,这两种连接池模式会有些区别。
功能 | 事务级别连接池 | 直连模式 |
---|---|---|
读写分离 | 支持 | 支持 |
读写权重 | 支持 | 支持 |
延迟阈值 | 支持 | 支持 |
读写分离的故障转移 | 支持 | 支持 |
控制台修改参数,参数立即生效 | 支持 | 不支持。直连模式需要用户断连后,参数修改才能生效。 |
连接复用 | 支持 | 不支持 |