我正在使用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分钟,将创建一个新的连接并进入空闲状态。因此,连接不断增加。我不知道为什么会这样。
提前致谢。
该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] 删除。
我来说两句