Golang-Postgres ..关闭数据库连接不适用于特定查询

达拉尼(Dharani Dharan):

我正在使用golang访问postgresql。这是我的职责

for {
    db, err := database.GetNewConnection(dbname)

    err = db.QueryRow("SELECT COALESCE(COUNT(1),0) FROM table").Scan(&count)

    if count == 0 {

        var insert = "INSERT INTO table(last_update_time,next_update_time,schedule_frequency)" +
            "VALUES($1,$2,$3)"
        prep_ins, err := db.Prepare(insert)
        if err != nil {
            return
        }
        _, err = prep_ins.Exec(cur_time, 1464718530, 86400)
        if err != nil {
            return
        }
        defer prep_ins.Close()
        defer db.Close()
    } else {
        var sel_str = "SELECT next_update_time FROM table"
        prep_update, err := db.Prepare(sel_str)
        if err != nil {

            return
        }
        _, err = prep_update.Exec()
        if err != nil {
            defer prep_update.Close()
            return
        }
        defer prep_update.Close()
        defer db.Close()
    }
    time.Sleep(10 * 60 * time.Second)
}

每10分钟,此函数将运行并执行这些语句。它的工作正常,但连接将处于空闲状态。我正在检查pg_stat_activity,状态仅为空闲。每隔10分钟,将创建一个新的连接并进入空闲状态。因此,连接不断增加。我不知道为什么会这样。

提前致谢。

abhink:

for循环是一个无限循环,它永远不会返回。这意味着延迟将永远不会执行,连接也不会关闭。您需要db.Close()在循环末尾添加显式

db如果不需要每次执行任务时都需要新的连接,也可以将初始化移出循环。您可以只创建一个连接并重新使用它。如果执行此操作,请defer在的初始化下方移动move 语句db如果数据库操作返回一些错误,则延迟将关闭连接。

db, err := database.GetNewConnection(dbname)
if err != nil {
    return fmt.Errorf("Error in creating database connection: %+v", err)
}
defer db.Close()
for {

    // ...

    db.Close()
}

这样可以确保在函数的每个返回路径上关闭连接(https://blog.golang.org/defer-panic-and-recover

如果仍然db在循环中保留初始化,请删除,defers因为它们只会添加到延迟堆栈中,而db连接将被明确关闭。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章