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

时间:2019-04-24 23:00:33

标签: node.js database connection-pooling knex.js

我正在使用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"}

一段时间不活动后。

据我所知,当经过足够的时间后,应该将连接从池中丢弃。因此,如果一段时间不使用连接(在我的情况下),则池中将没有连接,我尝试的第一个调用将因给定的错误而失败。随后的通话顺利通过(直到新的超时)

我的问题是-如何预防这种情况?

编辑

我的应用程序闲置了一段时间后,必须转到数据库级别的第一个活动失败,并显示给定错误。任何重复的呼叫都将成功。这就是为什么我相信knex不会检测到连接被丢弃为空闲状态,并且不会及时完成第一个查询的重新连接。我还认为问题出在knex端,而不是数据库端。

1 个答案:

答案 0 :(得分:-1)

所以我设法解决

{"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数据库驱动程序是如何工作的。