防止knex数据库连接池在空闲时关闭

Prevent knex database connection pool from closing when idle

我正在使用 Knex.js 来处理与数据库的连接。我试图防止连接池破坏空闲的连接。

我的配置是这样的

    {
      "client": "pg",
      "connection": {
        "host" : "localhost",
        "port" : "15432",
        "user" : "postgres",
        "password" : "",
        "database" : "postgres",
        "charset" : "utf8"
      },
      "pool": {
        "min" : 1,
        "max": 7,
        "idleTimeoutMillis": Number.MAX_SAFE_INTEGER
      },
      "migrations": {
        "directory": "app/database/migrations"
      }
    }

然而我还是不断收到

{"errno":"ETIMEDOUT","code":"ETIMEDOUT","syscall":"read"}

经过一段时间的inactivity。

据我所知,当经过足够长的时间后,应该从池中丢弃一个连接。因此,如果有一段时间不使用连接(这是我的情况),池中将没有连接,我尝试的第一次调用应该会失败并出现给定错误。随后的调用顺利进行(直到新的超时)

我的问题是 - 如何防止这种情况发生?

编辑

在我的应用程序闲置一段时间后,第一个 activity 必须转到数据库级别失败并出现给定错误。任何重复调用都会成功。这就是为什么我开始相信 knex 没有检测到连接因空闲而被丢弃,并且它没有及时重新连接以完成第一个查询。我也认为问题出在knex方面而不是数据库方面。

所以我设法修复了

{"errno":"ETIMEDOUT","code":"ETIMEDOUT","syscall":"read"}

错误,通过这样配置

{
  "client": "pg",
  "connection": {
    .
    .
    .      
  },
  "pool": { <- this is important
    "min" : 0 
  },
}

我在上找到了建议的解决方案 https://gist.github.com/acgourley/9a11ffedd44c414fb4b8

问题是,我没能理解为什么这是一个解决方案以及为什么我以前的配置不起作用。

需要注意的重要一点是,这些解决方案不会起作用

{
  "client": "pg",
  "connection": {
    .
    .
    .      
  },
  "pool": { 
    "min" : 0,
    "max" : 7 <- this fails in the same manner
  },
}

{
  "client": "pg",
  "connection": {
    .
    .
    .      
  },
  "pool": { 
    "min" : 0,
    "max" : 7 <- this fails in the same manner
    "ping": () => {... ping function ...}
  },
}

所以对我来说,这看起来像是在规避一些现有的错误...该错误要么在 knex 中,要么在 tarn.js 中,要么在 node-postgres 中。或者,问题可能是我根本不了解 JS 数据库驱动程序的工作原理。