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

Posted

技术标签:

【中文标题】查询 Postgresql 时偶尔会检索到“连接超时”错误【英文标题】:Occasionally retrieving "connection timed out" errors when querying Postgresql 【发布时间】:2017-03-13 22:25:46 【问题描述】:

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

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是否有可能将这些连接变成僵尸,因为它们已经打开了很长时间,并且在一个一个尝试它们失败后发生超时?

【问题讨论】:

这有帮助吗? go-database-sql.org/surprises.html 【参考方案1】:

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

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

希望这对其他人有所帮助。

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

【讨论】:

以上是关于查询 Postgresql 时偶尔会检索到“连接超时”错误的主要内容,如果未能解决你的问题,请参考以下文章

浅谈PostgreSQL的索引

(转)浅谈PostgreSQL的索引

PostGresql 分区表

PostgreSQL常用索引

PostgreSQL全文检索简介

MySQL 查询非常慢 - 偶尔