掌握多个数据库连接池


数据库连接池是一种技术,它允许应用程序通过重复使用一组已建立的连接来更有效地管理数据库连接。应用程序无需为每个数据库请求创建新的连接,而是维护一个可重复使用的开放连接池,从而大大减少了重复建立连接所需的时间和资源。

连接池的工作原理
以下是连接池在技术环境中的运行方式的细分:

  1. 连接初始化:当应用程序启动时,它会初始化固定数量的数据库连接并将它们存储在池中。
  2. 请求处理:每当请求需要与数据库交互时,应用程序就会从池中借用现有连接,而不是打开新的连接。
  3. 连接重用:执行查询后,连接将返回到池,以供将来的请求使用。
  4. 动态池管理:池可以动态调整大小,如果需求超过预定义的限制,则创建更多连接,并减少空闲连接以节省资源。

实现连接池
每个成熟的开发环境都有内置的连接池。例如,对于 PostgreSQL:

连接池、微服务和康威定律
如今,康威定律总是要发挥作用的,对吧?但为什么在这里呢?

在 Node.js 中使用pg.Pool之类的连接池库是实现许多应用程序的连接池的良好开端。它简单、易于设置,并且提供了开箱即用的基本池级别。您已经看到,从无池设置到中型应用程序的重构应该相当容易。

但是,它假设每个部署都有一个池。这对于单片系统或非高度分布式系统来说非常有效,但是……

如果您有同一服务的多个实例并且正在进行负载平衡,该怎么办?

如果您拥有包含数十个已部署服务的微服务该怎么办?

如果您不仅拥有 Node.js 应用程序,还使用其他堆栈(例如 Java、C#、Python 等)编写应用程序,该怎么办?

这可能导致在每个开发环境中重复设置连接池,维护起来很麻烦。

此外,如果所有这些应用程序都使用相同的数据库(例如,每个数据库模式共享),它们将不会使用相同的池,这可能再次导致池耗尽。

对于这些情况,您可以考虑使用专用服务进行池化。它将充当我们的应用程序和数据库之间的代理。示例如下:

实现连接池的最佳实践
让我们回顾一下所学知识,并尝试总结一下有效实施连接池需要遵守最佳实践,以确保最佳性能和资源管理。以下是一些建议:

  • 您可以从使用可靠的连接池库开始。选择适合您应用程序需求的连接池库或框架。这些库为连接池提供内置支持,并提供各种功能来自定义和优化池行为。
  • 妥善处理连接释放以防止连接泄漏。确保释放连接(例如在 try/finally 块或可重用助手中)。您还可以实现重试逻辑以妥善处理瞬时连接故障。提供后备机制以确保在出现连接问题时服务的连续性。
  • 如果您使用微服务、Kubernetes 或多种技术栈,请考虑使用 pgBouncer 等代理服务来统一负载平衡。
  • 如果您使用无服务器,请检查您的平台中可用的托管服务,例如 AWS RDS Proxy、Cloudflare Hyperdrive、Supabase Supervisor。由于无服务器功能的无状态性质,传统的连接池可能不是无服务器环境的最佳选择。
  • 定期监控和调整池设置。这对于保持最佳性能至关重要。跟踪连接使用情况、等待时间和池大小等指标以识别潜在问题。在系统发展过程中不断评估系统。