延迟:在长时间运行的函数中使用?

时间:2017-08-12 19:04:15

标签: go

这是一个示例函数,它从连接池获取与数据库的连接,并执行查询并处理返回的结果。

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()是否可以像这样,当我们知道资源长时间保存时,即使不需要它们?

2 个答案:

答案 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()即可。所以是的,最好的做法就是在你有一些长功能时使用它们。