查询Postgresql时偶尔会检索“连接超时”错误

时间:2016-10-31 19:09:42

标签: database postgresql go database-connection sqlx

我在使用带有pgx的sqlx时经常会出现这个错误,我相信这是我的配置错误和数据库概念我不理解:

error: 'write tcp [redacted-ip]:[redacted-port]->[redacted-ip]:[redacted-port]: write: connection timed out

尝试从数据库读取时会发生这种情况。我在启动阶段初始化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将这些连接转换为僵尸,因为它们已经打开了这么长时间并且在逐个尝试失败后发生了超时?

1 个答案:

答案 0 :(得分:0)

在一些粗略计算的帮助下,我将这些连接的最长寿命设置为10分钟。我将此代码插入上述问题的init函数中,以限制打开的连接数,空闲连接数,并将连接的生命周期限制为30秒。

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

希望这有助于其他人。

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