在Postgresql中的连接超时

病徵

当将pgpool-II的每个网络接口关闭时,即使设置了connect_timeout,只有在首次查询执行时才会返回超时错误的现象,对此提供处理方法:https://godoc.org/github.com/lib/pq

当病症发作时的环境

    • golang: 1.7系

 

    • ドライバ: lib/pq

 

    • pgpool-II: 3.6.1

 

    PostgreSQL: 9.5

应对的方法

将golang升级到1.8版本并使用QueryRowContext。有关详细信息,请访问https://golang.org/pkg/database/sql/#DB.QueryRowContext。

有另外一個Context版本的QueryRow,請使用那個。

//前の処理
//Timeout Contextを作成
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()

errChan := make(chan error, 1)

query := "select name from user limit 1"
var name string

go func() {
 errChan <- db.QueryRowContext(ctx, query).Scan(&name)
}()

select {
case <-ctx.Done():
    err = ctx.Err()
    break
case err = <-errChan:
    break
}
//続きの処理
广告
将在 10 秒后关闭
bannerAds