当前位置: 首页 > 知识库问答 >
问题:

如何在无服务器环境中管理 postgres 数据库句柄?

杨宏儒
2023-03-14

我有一个API运行在AWS Lambda和AWS Gateway使用Up。我的API在启动时创建一个数据库连接,因此Lambda在第一次触发该函数时会这样做。我的API是用node写的,使用Express和pg-promise来连接和查询数据库。

问题是Lambda在它认为合适的情况下创建函数的新实例,有时看起来好像一次有多个实例。

由于我的 Lambda 函数占用了太多数据库句柄,我的数据库连接数不断用完。如果我登录Postgres并查看pg_stat_activity表,我可以看到很多与数据库的连接。

解决此问题的建议模式是什么?可以限制Lambda中函数同时实例的数量吗?你能在一个函数的实例之间共享一个连接池吗。

AWS现在提供了一个名为RDS Proxy的产品,它是一个托管连接池解决方案,可以解决这个问题:https://aws.amazon.com/blogs/compute/using-amazon-rds-proxy-with-aws-lambda/

共有2个答案

柏麒
2023-03-14

您有两个选项来解决此问题:

> < li>

您可以调整Postgres以断开那些空闲连接。这是最好的方法,但可能需要一些反复试验。

您必须确保连接到处理程序中的数据库,并在函数返回或退出之前断开连接。在快速中,您必须在路由处理程序中连接/断开连接。

邴俊民
2023-03-14

有几种方法可能会耗尽数据库连接:

    < li >您的并发Lambda执行数超过了可用的数据库连接数。这当然是可能的。 < li >您的Lambda函数正在打开数据库连接,但没有关闭它们。这可能是罪魁祸首,因为web框架倾向于在请求之间保持数据库连接打开(这样更有效),但是在Lambda上没有机会关闭它们,因为AWS会静默地终止实例。

您可以通过控制数据库服务器上可用连接的数量(PostgreSQL上的max_connections设置)和并发Lambda函数调用的最大数量(如本文所述)来解决1。当然,这只是一个问题换另一个问题,因为当Lambda达到极限时,它将返回429个错误。

寻址2更棘手。处理数据库连接耗尽的传统而正确的方法是使用连接池。但是使用Lambda你不能在客户端做到这一点,而使用RDS你不能选择在服务器端做到这一点。您可以设置一个中间的持久连接池,但是这使得设置更加复杂。

在没有池的情况下,一种选择是在每次函数调用时创建和销毁数据库连接。不幸的是,这会给你的请求增加相当多的开销和延迟。

另一种选择是仔细控制您的客户端和服务器端连接参数。这个想法是首先让数据库在相对较短的空闲时间后关闭连接(在PostgreSQL上,这是由tcp_keepalives_*设置控制的)。然后,为了确保客户端永远不会尝试使用关闭的连接,您在客户端设置了一个比该值短的连接超时(如何这样做将取决于框架)。

我希望AWS能在某个时候给我们一个解决方案(比如服务器端RDS连接池)。你可以在AWS论坛的帖子中看到各种建议的解决方案。

 类似资料:
  • 问题内容: 我将文件的属性(大小,更新时间…)存储在数据库中。因此,问题在于如何管理数据库和文件的事务。 在Java EE环境中,JTA只能管理数据库事务。万一数据库更新成功但文件操作失败,是否应该为此编写文件回滚方法?此外,EJB容器中的文件操作违反了EJB规范。 你怎么看? 问题答案: 理想情况下,对外部资源(例如文件系统)的访问应通过 JCA连接器进行 。尽管围绕此讨论的文章很多,但我从未找

  • 我有两个spring boot应用程序(客户端)和一个spring boot管理员。我想在客户端应用程序中管理环境变量,但默认情况下,spring boot admin starter客户端和spring boot admin starter server不支持此功能(v1.5.2)。 在我的SBA中,我看到了除环境管理之外的日志、指标等。我试过spring cloud commons和eurek

  • 13.5.1. 账户管理语句 13.5.2. 表维护语句 13.5.3. SET语法 13.5.4. SHOW语法 13.5.5. 其它管理语句 13.5.1. 账户管理语句 13.5.1.1. CREATE USER语法 13.5.1.2. DROP USER语法 13.5.1.3. GRANT和REVOKE语法 13.5.1.4. RENAME USER语法 13.5.1.5. SET PAS

  • 问题内容: 我的源表和目标表存在于不同的服务器上。我 用来编写合并语句以使其同步。 谁能解释我如何引用存在于我内部不同服务器上的两个不同数据库 ? 问题答案: 可能的方法: 我建议采用以下方法,而不是尝试在两个数据库服务器之间使用 语句 。 方法1: 为每个SQL Server实例创建两个。例如,如果您有两个数据库SourceDB和DestinationDB,则可以创建两个名为 和的连接管理器 。

  • 然后 但是当我执行命令时,我出现了这个错误知道我的数据库已有表。我做错了吗?

  • 我想在DB环境是动态的服务器上使用jooq。 我想在SpringBoot2Gradle环境中使用jooq。但有一个问题。建造。gradle文件需要硬编码的数据库信息,但可用。我可以只在QueryDSL中创建类似QClass的JClass吗? 我在服务器的外部环境中创建动态数据源,如类名、用户名、密码和URL。无法使用硬编码的jooq。 =========== jdbc连接信息应该如图所示进行硬编码