database - 查询Postgresql时偶尔会出现 "connection timed out"错误

标签 database postgresql go database-connection sqlx

在将 sqlx 与 pgx 一起使用时,我经常遇到此错误,我认为这是我的配置错误和我没有掌握的数据库概念:

error: 'write tcp [redacted-ip]:[redacted-port]->[redacted-ip]:[redacted-port]: write: 连接超时

尝试从数据库中读取时会发生这种情况。我在启动阶段初始化sqlx:

package main

import (
    _ "github.com/jackc/pgx/stdlib"
    "github.com/jmoiron/sqlx"
)

//NewDB attempts to connect to the DB
func NewDB(connectionString string) (*sqlx.DB, error) {
    db, err := sqlx.Connect("pgx", connectionString)

    if err != nil {
        return nil, err
    }

    return db, nil
}

任何负责与数据库交互的结构都可以访问这个指针。他们中的大多数人使用 SelectGet,我知道这些连接会自行返回到池中。有两个函数使用Exec,它们只在函数结束时返回结果和错误。

其他说明

  • 我的 Postgres 数据库支持 100 个 max_connections
  • 出现此错误时我只显示了一些事件连接
  • 我没有使用 SetMaxIdleConnectionsSetMaxOpenConnections
  • 刷新页面并再次触发请求总是有效

关于这里可能发生的事情的任何提示?

编辑:我没有提到此服务器位于 compose.io 上,后者又托管在 AWS 上。 AWS 是否有可能将这些连接变成僵尸,因为它们已经打开了很长时间,并且在一个接一个地尝试不成功后发生超时?

最佳答案

借助一些粗略的计算,我将这些连接的最长生命周期设置为 10 分钟。我将这段代码插入到上面问题中的init函数中,以限制打开连接数、空闲连接数,并限制连接的生命周期为30s。

db.SetConnMaxLifetime(time.Duration(30) * time.Second)
db.SetMaxOpenConns(20)
db.SetMaxIdleConns(20)

希望这对其他人有帮助。

SELECT * FROM pg_stat_activity; 也非常适合确定连接。

关于database - 查询Postgresql时偶尔会出现 "connection timed out"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40348929/

相关文章:

database - 我应该如何实现这个 specflow 步骤?

mysql - WooCommerce 的类别和子类别如何保存在数据库中?

php - 从数据库表中仅获取选定的列 laravel 5 eloqouent

ruby-on-rails - rails gem Make_flaggable 不保存到数据库

regex - 正则表达式仅在golang中屏蔽任何匹配10位数字的字符串

windows - 如何使用特定环境值运行 go get 命令?

database - 错误 : right sibling's left-link doesn't match: block 19 links to 346956 instead of expected 346955 in index "pg_depend_reference_index"

html - Postgresql——清理字符串中间的 HTML 标签

c - 关闭与数据库的连接时不会释放内存(C,postgres - libpq)

go - Go 在运行时获取函数参数