goroutine共享数据库连接时如何关闭?

新手请教,示例代码:

db := openDb()
defer db.Close()
for i := 0; i < 10; i++ {
    go queryDb(db, i)
}

上面这里的defer是无效的,因为queryDb在不同的协程里,
那么这个close应该放在哪里呢?

func queryDb(db, i){
    defer db.Close()
    ...
}

这样也不行,因为连接要被多个协程共享,不能被某一个单独关闭。


补充:
所以只能这样对吗?

db := openDb()

for i := 0; i < 10; i++ {
    go queryDb(db, i)
}

func queryDb(db db.Conn, i int) {
    db.Exec()
    notify()
}
waitAll()  //使用等待任务全完成

db.Close()
阅读 2.6k
3 个回答

把 db 变量定义为全局变量,那样你的 queryDb 就直接能使用,db 的 open 和 close 都在主函数里操作就成。

使用连接池,比如 gorm 这些 db 库,都提供连接池的封装

去查一下 sync.WaitGroup

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题