具有单个连接的连接池

时间:2016-10-24 09:03:15

标签: database postgresql connection-pooling

我想就我对连接池面临的情况有所了解。

我是SW开发人员,致力于一些多租户应用程序。我们有一个数据库,每个租户(客户端)都拥有自己的架构。对于每个连接的租户,启动独奏过程并获得独立数据库连接。在不久的将来,我需要在300多个同时租户环境中使用它。

根据我的阅读,不建议使用大量连接(100+)到postgres。一种解决方案是使用连接池。另一个是使用更多数据库服务器。

我在想连接pooler(pgBouncer,pgPool)。但在我们的应用程序的当前状态,它有点问题。这是"有问题的"的列表项目和建议的解决方案:

  1. 在整个生命周期内与服务器建立单一连接 - 这是因为我们正在大量使用临时表和预处理语句。临时表的持续时间是可变的,但在大多数情况下,它们会跨越多个事务。

    • 因为连接池将返回" free"连接我无法确定在返回的连接中是否创建了给定的临时表。但我想我可以解决它创建"临时表"在预定义的模式中(但后来我需要有一些后台任务来清理那些没有完全关闭或崩溃的进程的孤立临时表 - postgres临时表会在连接关闭时自动关闭)。对于准备好的陈述,我还没有找到解决方法。
  2. 使用"设置search_path =" custom_schema",public;" - 这是在每个租户的应用程序启动时完成的,因此使用了正确的表。

    • 可以通过在每个事务上发出set search_path = ...命令来解决此问题。它应该便宜/快速。
  3. 使用依赖于临时表的触发器 - 这用于自动记录某些内容。它使用在应用程序启动时自动创建的临时表。

    • 暂不提供解决方案,因为无法使用"自定义表方法"上面提到的因为表名应该是常量(多个租户会多次创建同一个表,这很糟糕)。
  4. 所以,我不知道我是否应该开始考虑重新设计。如果我可以添加更多的数据库服务器,一切都会运行,而不需要重新设计它。

    您怎么看?

    谢谢

1 个答案:

答案 0 :(得分:0)

使用pool_mode = session的pgbouncer中的这些问题不是问题。