原理图
事务级连接池的原理图如下:

事务级连接池主要用于减少直接连接到数据库的业务连接数,以及减少短连接场景下频繁建连带来的负载。
开启事务级连接池后,客户端与PolarDB代理间可以存在上千个连接,但代理与后端数据库间可能只存在几十或几百个连接。
PolarDB代理本身并没有最大连接数的限制,连接数的限制主要由后端数据库中计算节点的规格决定。未开启事务级连接池时,每条由客户端发起的连接都需要在后端主节点和所有只读节点上各创建一个对应的连接。
开启事务级连接池后,当客户端发送请求时,会先与PolarDB代理建连,代理不会马上将其与后端数据库建连,而是先从事务级连接池里查找是否存在可用的连接(判断是否为可用连接的条件:user、dbname和系统变量这3个参数值是否一致)。若不存在,代理会与数据库创建一个新连接;若存在,则从连接池里直接拿出并使用,并在当前事务结束后将该连接放回事务级连接池,方便下个请求继续使用。
使用限制
- 当执行以下行为时,锁定连接,直至连接结束,即该连接不会再被放到连接池里供其它用户连接使用。
- 执行PREPARE语句
- 创建临时表
- 修改用户变量
- 大报文(例如16 MB以上)
- 使用lock table
- 多语句
- 存储过程调用
- 不支持FOUND_ROWS、ROW_COUNT和LAST_INSERT_ID函数的调用,这些函数可以调用成功,但是无法保证调用结果的正确性。其中:
- 1.13.11及以上的数据库代理版本支持在SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 语句后直接使用SELECT FOUND_ROWS()命令。但MySQL官方已不推荐该用法,建议您将SELECT FOUND_ROWS()替换为SELECT COUNT() FROM tb1进行查询,详情请参见FOUND_ROWS()。
- 支持在INSERT后直接使用SELECT LAST_INSERT_ID()语句,来保证查询结果正确性。
- 对于设置了wait_timeout的连接,wait_timeout在客户端的表现可能不会生效。因为每次请求都会从连接池中获取连接,当wait_timeout超时后,只有连接池中的后端连接会断开,而后端连接断开并不会导致客户端连接断开。
- 除了sql_mode、character_set_server、collation_server、time_zone这四个变量以外,如果业务依赖其他会话级别的系统变量,那么需要客户端在建连之后显式进行SET语句执行,否则连接池可能会复用系统变量已经被更改过的连接。
- 由于连接可能会被复用,所以使用select connection_id()查询当前连接的thread id可能会变化。
- 由于连接可能会被复用,所以show processlist或者SQL洞察中显示的IP地址和端口,可能会与客户端实际的IP地址和端口不一致。
- 数据库代理会将所有节点上的SHOW PROCESSLIST结果合并后再返回最终结果,而在事务级连接池开启后,前端连接和后端连接的thread id无法对应。这导致执行KILL命令时可能会返回一个错误,但是实际上KILL命令已经正常执行成功,可再通过SHOW PROCESSLIST确定相应的连接是否断开。
最后修改时间:2023-07-19 11:41:14
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




