Go 我应该何时关闭此简单web应用中的数据库连接?
我正在编写一个使用PostgreSQL的简单Go web应用程序。我的Go 我应该何时关闭此简单web应用中的数据库连接?,go,Go,我正在编写一个使用PostgreSQL的简单Go web应用程序。我的main函数如下所示 var db *sql.DB func main() { var err error db, err = sql.Open("postgres", "...") if err != nil { log.Fatalf("Couldn't connect to the database: %v", err) } http.HandleFunc("/w
main
函数如下所示
var db *sql.DB
func main() {
var err error
db, err = sql.Open("postgres", "...")
if err != nil {
log.Fatalf("Couldn't connect to the database: %v", err)
}
http.HandleFunc("/whatever", whateverHandler)
http.ListenAndServe("127.0.0.1:8080", nil)
}
似乎我应该在某个时候对数据库连接调用
Close()
,但是什么时候?此应用程序将永远服务(即直到我用^C
杀死它)。如果我将代码放在listendServe
调用之后,它将不会运行,因为我的^C
已经杀死了整个应用程序。我的应用程序是否应该采用不同的结构?在这种情况下,我倾向于说您甚至不需要麻烦:当程序结束时,连接将关闭,因此不会泄漏任何内容
如果您确实需要正确地关闭东西,更简单的选择是使用服务器,并推迟资源关闭
或者,如果您的用例更复杂,请手动捕获并以自己的方式优雅地关闭(例如使用关闭通道)。重要的是要理解
sql.Open()
不会打开到数据库的连接
Open可能只验证其参数,而不创建与数据库的连接。要验证数据源名称是否有效,请调用Ping
此外,重要的是要了解驾驶员负责连接的维护。因此,您可能希望在应用程序的生命周期内保持它的开放状态
返回的数据库对于多个goroutine并发使用是安全的,并维护自己的空闲连接池。因此,Open函数应该只调用一次。很少需要关闭数据库
伟大的我是新手,我不清楚即使应用程序被终止,连接是否会关闭。请注意,在数据库连接的情况下,它对您不是超级重要的
db。关闭整个池。否则,在实际调用操作系统之前捕获信号(SIGTERM)并运行它。退出可能是“最安全”的方法。如果你刚刚开始,不要太过分心。正如Elwinar所说,在这种情况下,这并不重要,但通常你会在打开的任何资源之后放置defer foo.Close()
。否则,您可能会忘记稍后调用Close
。