RDS PostgreSQL数据库代理支持事务级连接池功能。您可以根据业务需求使用事务级连接池,帮助降低因大量连接导致的数据库负载压力。
功能简介
RDS PostgreSQL数据库代理提供事务级连接池功能。当应用存在大量短连接、连接创建频繁或连接数达到PostgreSQL数据库连接数上限时,开启事务级连接池可以显著降低数据库主进程的开销和总连接数。
应用场景
业务侧多为短连接。
连接创建频繁。
连接数量很大(达到PostgreSQL数据库的连接数限制)。
工作原理
开启事务级连接池后,当客户端发起连接会话请求时,先与数据库代理建立前端连接,代理不会马上将其与后端数据库建立连接;当需要处理请求时,从事务级连接池里查找是否存在可用的后端连接:
判断是否为可用后端连接的条件:user、dbname等参数值是否一致。
若存在,则直接使用,并在当前事务结束后将该连接放回事务级连接池。
若不存在,代理会与数据库创建一个新的后端连接。
多个会话可共用一个后端连接。事务活跃的连接会占用后端连接,事务非活跃的连接不会占用后端连接,如下图所示:
这样,通过让一个后端连接在一段时间内处理多个会话的事务请求,可以实现以下优势:
减少连接频率:后端保持与数据库的持续连接,减少了频繁建立新连接的需求,从而降低数据库主进程的负载。
降低总连接数:多个会话共享同一个后端连接,避免了闲置连接占用资源,减少了数据库的总连接数。
数据库代理本身并没有最大连接数的限制,连接数的限制由后端数据库的规格决定。
使用限制
当开启事务级连接池时,发送
CANCEL请求可能导致会话挂起(Hang)。建议在使用CANCEL功能时关闭事务级连接池。当执行以下行为时,锁定连接,直至连接结束,即该连接不会再被放到连接池里供其他用户连接使用:
执行
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地址和端口不一致。
设置连接池
前提条件
注意事项
本文介绍的连接池功能是指RDS PostgreSQL数据库代理的连接池功能,不影响客户端的连接池功能,如果您的客户端已经支持连接池,则可以不使用数据库代理的连接池功能。
连接池不能解决由于存在大量慢SQL,导致的连接堆积问题,建议自行优化SQL,或者在PostgreSQL侧排查慢的原因。
操作步骤
访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏,单击数据库代理。
在连接信息区域,您可以通过两种方法开启连接池:
说明默认关闭连接池。
修改连接池类型后,仅对新连接生效。
方法一:将鼠标置于代理连接地址(终端)ID右侧的图标,在弹出的对话框中单击开启事务级连接池,然后在弹出的对话框中单击确定。
方法二:在目标代理连接地址操作列,单击修改配置,在弹出的对话框中,在连接池右侧选中事务级连接池后单击确定,即开启了事务级连接池。
说明如果原来已经开启了连接池,重新选择连接池类型,可修改类型。
相关API
API | 描述 |
查询数据库代理详情。 | |
查询数据库代理的连接地址信息。 | |
修改数据库代理的连接地址访问策略。 |
相关概念
短连接:指仅在短时间保持的连接。例如,PHP应用程序在执行一个简单查询后关闭连接。优点是无需长期占用连接通道,缺点是每次发送业务都要重新建立连接,增加PostgreSQL数据库主进程的开销。
长连接:指长时间保持的连接。例如,Web服务器或应用程序服务器打开许多到PostgreSQL服务器的连接,并保持它们打开,直到客户端停止。优点是与数据库建立连接的次数少,减少主进程开销。缺点是需要长期占用连接通道。
常见问题
Q:连接数达到多少,建议开启连接池?
A:连接数可能达到PostgreSQL上限时,建议开启事务级连接池。
Q:连接池的连接保持时间是多少?
A:10秒。
Q:使用连接池对实例性能有影响吗?
A:连接断开的原因很多,需要根据具体情况分析,不一定是因为应用和数据库代理都用了连接池的功能。