PolarDB支持事务级连接池,您可以根据业务需求使用事务级连接池,帮助降低因大量连接导致的数据库负载压力。
前提条件
事务级连接池功能需要数据库代理的版本为2.3.46及以上。
背景信息
由于PolarDB PostgreSQL版的连接模型是每个连接需要创建一个进程进行处理,所以当客户端同时保持大量的长连接或频繁创建新连接时,数据库的压力会变大,而且性能也会严重衰减。
为了提高这些场景下的性能。PolarDB PostgreSQL版提供事务级连接池功能。通过让多个前端连接共享一个后端连接的方式,减少后端建连次数与保持的连接数,从而提升这些场景下数据库的处理能力。
原理介绍
事务级连接池主要用于减少直接连接到数据库的业务连接数,以及减少短连接场景下频繁建连带来的负载。
开启事务级连接池后,当客户端发送请求时,会先与PolarDB代理建连,代理不会马上将其与后端数据库建连,而是先从事务级连接池里查找是否存在可用的连接(判断是否为可用连接的条件:user、dbname和系统变量这3个参数值是否一致)。若不存在,代理会与数据库创建一个新连接;若存在,则从连接池里直接拿出并使用,并在当前事务结束后将该连接放回事务级连接池,方便下个连接请求继续使用。从而达到减少了数据库代理和数据库的连接数的目的。
开启事务级连接池后,客户端与PolarDB代理间可以存在上千个连接,但代理与后端数据库间可能只存在几十或几百个连接。
PolarDB代理本身并没有最大连接数的限制,连接数的限制主要由后端数据库中计算节点的规格决定。未开启事务级连接池时,每条由客户端发起的连接都需要在后端主节点和所有只读节点上各创建一个对应的连接。
使用说明
开启事务级连接池
登录PolarDB控制台。
在控制台左上角,选择集群所在的地域。
找到目标集群,单击集群ID。
在链接地址区域,单击配置。
单击连接池右侧的事务级。
单击确定。
关闭事务级连接池
登录PolarDB控制台。
在控制台左上角,选择集群所在的地域。
找到目标集群,单击集群ID。
在链接地址区域,单击配置。
单击连接池右侧的关闭。
单击确定。
使用限制
当执行以下行为时,锁定连接,直至连接结束,即该连接不会再被放到连接池里供其他用户连接使用。
执行
PREPARE
语句大报文(例如16 MB以上)
使用COPY模式(
Copy Mode
)使用刷新模式(
Flush Mode
)临时表(
Temporary Table
)、序列(Sequence
)、视图(View
)在事务中
声明游标(
Cursor
)
以下PostgreSQL特性与事务级连接池存在兼容性限制,使用时可能导致非预期行为。建议在启用这些功能时,关闭事务级连接池,以确保语义正确性:
序列(
Sequence
)应用级锁(
Advisory Lock
)监听与通知(
LISTEN/NOTIFY
)可保持游标(
Holdable Cursor
)
由于连接可能会被复用,所以使用
select pg_backend_pid()
查询当前连接的pid
可能会变化。由于连接可能会被复用,所以
pg_stat_activity
或者SQL洞察中显示的IP地址和端口,可能会与客户端实际的IP地址和端口不一致。
连接池的选择
您可以根据如下建议评估选择是否开启连接池:
若业务使用的多为长连接且连接数较少,或者业务本身已具备较好的连接池,那么您可以不使用PolarDB的连接池功能。
若业务使用的连接数较多(如连接数需求上万)或使用的是Serverless服务(即连接数会随着业务端服务器的扩容而线性增加),且确认您的业务不涉及上述事务级连接池使用限制的场景,那么您可以选择开启事务级连接池。