【问题标题】:how to close database connection without terminating the server connection in golang如何关闭数据库连接而不终止golang中的服务器连接
【发布时间】:2021-07-19 05:54:53
【问题描述】:

有什么方法可以在不终止 HTTP 服务器的情况下关闭数据库连接?

我的代码:

func thisone(w http.ResponseWriter,r *http.Request){
    /*connect the db*/
    defer database.Close()
    /*query the database*/
}

func main(){
  http.HandleFunc("/route",thisone)
  http.ListenAndServe(":8000",nil)
}

这是在查询数据库后终止程序并停止监听端口 但即使在数据库连接关闭后,我也想继续监听端口。 那么有没有办法做到这一点

谢谢

【问题讨论】:

  • 不要关闭数据库。它旨在跨请求同时安全地重用和使用。 Go 的 SQL 包带有很多优化,比如连接池。因此,在您的“服务器”结构中初始化数据库连接 - 并让所有需要它的 http 处理程序(结构方法)使用这个公共数据库。这样他们就不需要为每个请求建立自己的数据库。
  • 您使用的是哪个数据库客户端?数据库客户端在连接关闭时终止程序很奇怪。
  • 仅供参考:此博客包含许多编写 Web 服务的最佳实践:pace.dev/blog/2018/05/09/…
  • @colm.anseo 感谢您抽出宝贵时间,我会检查一下 :)

标签: mysql database go httpserver


【解决方案1】:

每次查询数据库时都会调用 thisone() 并且每次执行该函数时都会关闭数据库连接。尝试将database.Close() 放在主函数中。

func main(){
    defer database.Close()

    http.HandleFunc("/route",thisone)
    http.ListenAndServe(":8000",nil)}

【讨论】:

  • 嗨,Enrique 感谢您抽出宝贵的时间回答,我有一个疑问,如果我在主函数中声明 defer database.Close() 那么我应该在主函数中定义数据库连接吗?否则,它会给我一个错误。但我在该函数中有一个发布请求(thisone()),请求正文将查询数据库。查询后,我需要关闭数据库连接并监听端口,但在我的情况下,它正在终止程序。您还有其他想法吗?
【解决方案2】:

在 main 函数中设置 database.Close() 时出错,这有点奇怪,因为我最近用 Go 做了一个 API Rest 有点相似。代码可以看这里,希望有用。

Github API Rest with Go

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2011-05-11
    • 2017-11-22
    • 2018-03-01
    相关资源
    最近更新 更多