强调 spring 启动服务时消耗的 GCP Postgres 连接数(使用 SQL 云代理)

GCP Postgres connections consumed when stressing spring boot service (using SQL Cloud proxy)

我正在为 post 数据开发 Spring 引导服务,并将其保存在 GCP SQL Postgres 数据库中。 问题是当我用请求强调服务时,我得到一个关于消耗所有可用连接的 SQL 异常:

"FATAL: remaining connection slots are reserved for non-replication superuser connections"

我发现了这个问题,我添加了一个正确的 hikari 配置来限制使用的连接并设置何时关闭空闲连接的限制,这是我的 properties.yml 配置:

 type: com.zaxxer.hikari.HikariDataSource
 hikari:
   initializationFailTimeout: 30000
   idle-timeout: 30000
   minimum-idle: 5
   maximum-pool-size: 15
   connection-timeout: 20000
   max-lifetime: 1000 

当我 运行 使用同一数据库在本地使用该服务时,该服务在该设置下运行良好,但是当我从我的云设置中 运行 它时,它会消耗所有可用连接,然后得到相同的异常.

重要!我正在使用 SQL 云代理连接到数据库。

以下是数据库可用连接的屏幕截图:

1- 运行启用服务之前

2- 运行在本地启用服务后

3- 运行从云端连接服务后

经过几天排查这个问题,我们找到了一个缓解问题但没有彻底解决问题的方案(最后提到了理想的方案)。

如果您想继续使用 SQL 云代理,那么您需要接受您无法完全控制数据库连接配置的事实,因为 SQL 云代理可能会保留这些连接的活动时间超过您配置的时间 (source)。

为了缓解这个问题,我们使用了 docker registry 的 SQL 云代理 1.19.2,我们使用了这个 hikari 配置:

hikari:
  idle-timeout: 30000 # maximum amount of time (in milliseconds) that a connection is allowed to sit idle in the pool
  minimum-idle: 1 # minimum number of idle connections that HikariCP tries to maintain in the pool, including both idle and in-use connections. If the idle connections dip below this value, HikariCP will make a best effort to restore them quickly and efficiently
  maximum-pool-size: 15 # maximum size that the pool is allowed to reach, including both idle and in-use connections. Basically this value will determine the maximum number of actual connections to the database backend
  connection-timeout: 20000 #maximum number of milliseconds that a client will wait for a connection
  max-lifetime: 20000 # maximum lifetime in milliseconds of a connection in the pool after it is closed.

在这种情况下,正确的解决方案是使用 共享 VPC 与您的数据库建立专用连接,您将依靠数据库驱动程序建立这些连接。