2 回答

TA貢獻1909條經(jīng)驗 獲得超7個贊
該database/sql
包沒有提供一種通用的方法來超時調(diào)用database/sql.Open
. 但是,各個驅(qū)動程序通過 DSN (dataSourceName) 連接字符串提供此功能。
sql.Open("postgres", "user=user dbname=dbname connect_timeout=5")
https://github.com/go-sql-driver/mysql
sql.Open("mysql", "user:password@/dbname?timeout=5s")
https://github.com/denisenkom/go-mssqldb
sql.Open("sqlserver", "sqlserver://username:password@host/instance?dial+timeout=5")
ETC ...

TA貢獻1872條經(jīng)驗 獲得超4個贊
從 Go 1.8 開始,sql.DB抽象現(xiàn)在接受context.Context,可用于更快地超時連接。
func (c *Client) DoLookup(ctx context.Context, id int) (string, error) {
var name string
// create a child context with a timeout
newCtx, cancel := context.WithTimeout(ctx, time.Second)
// release resources used in `newCtx` if
// the DB operation finishes faster than the timeout
defer cancel()
row := c.db.QueryRowContext(newCtx, "SELECT name FROM items WHERE id = ?", id)
err := row.Scan(&name)
if err != nil {
return "", err
}
return name, nil
}
如果你的DoLookup函數(shù)還沒有使用context.Context(它真的應(yīng)該?。┠憧梢酝ㄟ^調(diào)用來創(chuàng)建一個父函數(shù)context.TODO()。
- 2 回答
- 0 關(guān)注
- 287 瀏覽
添加回答
舉報