在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
}
//続きの処理