Database 在Postgres中我真的需要空闲连接吗?

Database 在Postgres中我真的需要空闲连接吗?,database,postgresql,spring-boot,postgresql-9.1,pgbouncer,Database,Postgresql,Spring Boot,Postgresql 9.1,Pgbouncer,我在SpringBoot(1.5.1.RELEASE)中有一个项目,它使用PostgresDB(9.1-901-1) 当我在生产环境中运行此应用程序时,它将创建多达100个以DB为单位的空闲连接 因此,我覆盖默认配置以控制创建“N”个空闲连接。请检查以下配置: datasource: driverClassName: org.postgresql.Driver url: jdbc:postgresql://localhost:5432/db_name username: root

我在SpringBoot(1.5.1.RELEASE)中有一个项目,它使用PostgresDB(9.1-901-1)

当我在生产环境中运行此应用程序时,它将创建多达100个以DB为单位的空闲连接

因此,我覆盖默认配置以控制创建“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?

您建议的配置绝对不推荐。一个完整的数据库连接周期将完成

  • 建立TCP连接
  • 验证凭据
  • 连接就绪
  • 执行命令
  • 断开
  • 通过使用DB维护空闲连接(连接池),您可以节省步骤1-3所花费的时间,从而获得更好的性能

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


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

    如果您想要一个反应缓慢的应用程序,这是最好的选择。创建到数据库的连接是一项耗时的操作,因此您希望使用连接池并重用现有连接。这些连接在实际使用之前是空闲的。如果您将其配置为没有空闲连接(或最小/最大连接),则基本上可以绕过连接池。实际使用的值取决于您的站点及其使用方式。在我工作的一个站点上,我们在启动时有75个空闲连接,它们在正常的一天中占90%左右。但在高峰时期,情况就超过了这一点。这是为表现而作的调整。这是一个测试,一个小站点,然后继续。这是生产站点。。因此,我认为我必须使用更多的空闲连接在我看来,最好的方法是对应用程序的数据库使用情况进行基准测试,以确定适合您的情况的空闲连接数。将最大和最小空闲设置为100,并监控使用情况。如果您的应用程序最多使用10个连接(其中90个保持空闲),那么将最小空闲设置为10,最大空闲设置为20就足够了。因此,答案是,我需要根据需要和性能设置大量空闲连接。让我和我的DBA团队一起进行一些研发,并找出连接的数量。