当前位置: 首页 > 知识库问答 >
问题:

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

谢鸿飞
2023-03-14

我正在使用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/migrathtml" target="_blank">ions"
      }
    }

然而,我仍然不断得到

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

在一段时间不活动后。

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

我的问题是——如何防止这种情况?

编辑

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

共有1个答案

戚阳
2023-03-14

所以我设法修复了

{"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 ...}
  },
}

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

 类似资料:
  • null 如果我理解正确的话,我们应该在启动时有1个空闲连接,根据负载从0到3,对吗? 正在发生的情况是:启动时1个连接,如果负载较低,最多3个空闲连接,高负载后超过3个空闲连接。然后这些连接不会立即关闭,我们不知道它们何时/是否会关闭(有时它们中的一些会关闭)。 所以问题是:这种行为正常吗? DAO子类的使用示例:

  • 我有一个在wildfly 8.1下运行的应用程序,应用程序中使用的数据库连接来自standalone中定义的数据源。xml文件。 问题:我不知道为什么,但池中的连接从不空闲,并且会被释放。最终,池被填满,所有活动连接和应用程序开始抛出 同时,当我查看数据库时,大多数连接显示为空闲。(配置和结果输出如下) 我已经做了一个星期了,还没能找出这个问题的根本原因。我还检查了所有创建连接的地方,并确保它们在

  • 我对HikariCP很陌生,我遇到了一个问题。我有一个使用hikaridaTasource从数据库获取连接的方法: 但是,当我检查pgAdmin(这是一个PostgreSQL db btw)时,我看到它没有使用空闲连接,而是创建了一堆新连接。我怎么才能修好这个? 您可以看到,在第一个图像中有19个连接,其中18个是空闲的。但是,在查询之后,会有一堆新的连接,其中大多数是空闲的。我配置Hikari错

  • 问题内容: 我看到许多连接处于打开状态,并且很长一段时间(例如5分钟)保持空闲状态。 有什么解决方案可以在不重新启动mysql服务的情况下从服务器终止/关闭它? 我正在维护旧的PHP系统,无法关闭为执行查询而建立的连接。 我应该将my.cnf文件中的超时值减少为默认的8小时吗? 问题答案: 手动清理: 您可以杀死该进程ID。 但: php应用程序可能会报告错误(或网络服务器,请检查错误日志) 不要

  • 在配置DBCP2池时,根据文档,我注意到-有一个名为timebetweenvictionrunsmillis的配置,描述如下: 空闲对象逐出器线程运行之间的Hibernate毫秒数。如果为非正,则不会运行空闲对象逐出器线程。 其默认值为-1。 这是否意味着逐出器线程永远不会在默认配置下运行?那么配置参数maxIdle是如何强制的?如果空闲连接的计数大于maxIdle,池必须退出空闲连接。 默认配置

  • 我正在使用带有连接池的reactor-netty http客户端(0.7.X系列),我想配置池连接的空闲超时,但不知道在哪里。 更准确地说,我需要配置reactor-netty http客户端连接池,使其能够自动关闭在可配置超时内未看到任何活动的连接。这些连接是开放的,但在一段(可配置的)时间内没有传输字节。 如何配置reactory-netty超文本传输协议客户端抢先关闭空闲连接?