【问题标题】:Do I realy need Idle Connection in Postgres?我真的需要 Postgres 中的空闲连接吗?
【发布时间】:2018-09-29 18:44:06
【问题描述】:

我在 Spring Boot (1.5.1.RELEASE) 中有一个使用 Postgres DB (9.1-901-1) 的项目。

当我在生产中运行此应用程序时,它将在数据库中创建多达 100 个空闲连接。

所以我覆盖了默认配置来控制创建“N”个空闲连接。请检查以下配置:

datasource:
  driverClassName: org.postgresql.Driver
  url: jdbc:postgresql://localhost:5432/db_name
  username: root
  password: root
  tomcat:
  # default value is 100 but postgres' default is 100 as well. To prevent "PSQLException: FATAL: sorry, too many
  # clients already", we decrease the max-active value here. Which should be sufficient, by the way
    max-active: 10
    max-idle: 10
    min-idle: 5
    max-wait: 30000
    time-between-eviction-runs-millis: 5000
    min-evictable-idle-time-millis: 60000
    jmx-enabled: true

现在它创建了 5 个与 DB 的空闲连接。

我正在通过执行以下查询来验证这一点。

select * from pg_stat_activity;

现在我的问题是,我真的需要 5 个空闲连接用于生产环境吗?

如果我像下面这样更改我的配置会发生什么?这会没有任何问题吗?

 max-active: 1
 max-idle: 1
 min-idle: 0

还想知道 PgBouncer 将如何帮助解决此案? Postgres需要PgBouncer吗?

【问题讨论】:

  • 如果您想要一个反应缓慢的应用程序,这就是您要走的路。创建与数据库的连接是一项耗时的操作,因此您希望使用连接池并重用现有连接。在实际使用之前,这些连接处于空闲状态。如果您将其配置为没有空闲(或最小/最大连接),您基本上会绕过拥有连接池的全部要点。
  • 实际使用的值取决于您的站点及其使用方式。在我工作的一个站点上,我们在启动时有 75 个空闲连接,并且它们在正常情况下习惯了大约 90%。但它在高峰期超过了这一点。这是为了性能而调整的。这是一个测试,小站点,然后继续。
  • @Nic3500 这是生产站点.. 所以我想我必须使用更多的空闲连接数
  • 在我看来,了解适合您情况的正确数字的最佳方法是对应用程序的数据库使用情况进行基准测试。将最大和最小空闲设置为 100 并监控使用情况。如果您的应用程序最多使用 10 个连接(其中 90 个保持空闲),那么将您的 min-idle 设置为 10,将 max-idle 设置为 20 就足够了。

标签: database postgresql spring-boot postgresql-9.1 pgbouncer


【解决方案1】:

你提出的配置绝对不推荐。一个完整的DB连接周期会经过

  1. 建立 TCP 连接
  2. 验证凭据
  3. 连接就绪
  4. 执行命令
  5. 断开连接

通过维护与数据库的空闲连接(连接池),您可以节省步骤 1-3 所花费的时间,从而获得更好的性能。

您应该根据将连接的微服务的最大实例来调整数据库上的设置。例如如果微服务实例的最大数量为 5,并且服务配置为维护 50 个空闲连接,则确保您的数据库配置为满足至少 250 个连接。

要达到微服务的最小连接设置,您需要根据您的非功能性需求和服务负载测试进行一些测试。

【讨论】:

  • 所以答案是,我需要根据需要和性能有足够数量的空闲连接。让我和我的 DBA 团队一起做一些研发并找出连接数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 2012-03-13
  • 2020-01-29
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多