Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 我应该何时关闭此简单web应用中的数据库连接?_Go - Fatal编程技术网

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

我正在编写一个使用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("/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