这是一个示例函数,它从连接池获取与数据库的连接,并执行查询并处理返回的结果。
func dbQuery() error {
con := db.getConn()
result, err := con.Query()
if err != nil {
return err
}
defer con.close() // or con.close()
// Processing the result takes a long time
return nil
}
在这种情况下处理结果需要很长时间并且不会为连接调用close,这意味着它不会返回到连接池。
在情况下直接调用con.close()是否可以像这样,当我们知道资源长时间保存时,即使不需要它们?
答案 0 :(得分:4)
我的建议是重构您的代码。这样defer
关闭连接,然后处理结果:
func dbQuery() error {
result, err := getResult()
if err != nil {
return err
}
// Processing the result takes a long time
return nil
}
func getResult() (*Rows, error) {
con := db.getConn()
defer con.close() // or con.close()
result, err := con.Query()
if err != nil {
return nil, err
}
return result, err
}
答案 1 :(得分:2)
在大多数情况下,Close()
方法是幂等的,可以安全地多次调用。如果出现错误和/或早期函数返回,则为defer con.Close()
,但只要完成后就明确调用Close()
即可。所以是的,最好的做法就是在你有一些长功能时使用它们。