我在使用带有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
}
任何负责与数据库交互的结构都可以访问此指针。他们中的大多数使用Select
或Get
,我理解他们自己返回池的连接。有两个函数使用Exec
,它们只返回函数末尾的结果和错误。
max_connections
SetMaxIdleConnections
或SetMaxOpenConnections
有关此处可能发生的事情的任何提示?
编辑:我没有提到这个服务器在compose.io上,而后者又在AWS上托管。是否有可能AWS将这些连接转换为僵尸,因为它们已经打开了这么长时间并且在逐个尝试失败后发生了超时?
答案 0 :(得分:0)
在一些粗略计算的帮助下,我将这些连接的最长寿命设置为10分钟。我将此代码插入上述问题的init函数中,以限制打开的连接数,空闲连接数,并将连接的生命周期限制为30秒。
db.SetConnMaxLifetime(time.Duration(30) * time.Second)
db.SetMaxOpenConns(20)
db.SetMaxIdleConns(20)
希望这有助于其他人。
SELECT * FROM pg_stat_activity;
也非常适合确定连接。