如何在Go语言中正确关闭多个Goroutine共享的数据库连接?

如何在go语言中正确关闭多个goroutine共享的数据库连接?

Go语言多Goroutine共享数据库连接的优雅关闭

在Go语言并发编程中,多个Goroutine共享数据库连接是常见场景。不当的连接关闭方式可能导致数据丢失或程序崩溃。本文探讨如何安全地关闭多个Goroutine共享的数据库连接。

问题分析:

直接在主Goroutine使用defer db.Close()无法保证所有子Goroutine都已完成数据库操作,可能导致连接提前关闭,引发错误。在每个子Goroutine中使用defer db.Close()则会导致连接被多次关闭,同样引发错误。

解决方案:

立即学习“go语言免费学习笔记(深入)”;

推荐使用计数器和sync.WaitGroup来协调Goroutine的执行和数据库连接的关闭。

示例代码:

package mainimport (    "fmt"    "sync"    "time"    "database/sql"    _ "github.com/go-sql-driver/mysql" // 替换成你的数据库驱动)type dbConn struct {    conn *sql.DB    wg   *sync.WaitGroup}func openDb() (*dbConn, error) {    db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database") // 替换成你的数据库连接字符串    if err != nil {        return nil, err    }    return &dbConn{conn: db, wg: &sync.WaitGroup{}}, nil}func (dc *dbConn) close() error {    dc.wg.Wait() // 等待所有 Goroutine 完成    return dc.conn.Close()}func querydb(dc *dbConn, i int) {    defer dc.wg.Done()    dc.wg.Add(1) // 计数器加1    // ... 数据库操作 ...    time.Sleep(time.Second) // 模拟数据库操作耗时    fmt.Printf("Goroutine %d finishedn", i)}func main() {    dc, err := openDb()    if err != nil {        fmt.Println("Error opening database:", err)        return    }    defer dc.close() // 确保最后关闭连接    for i := 0; i < 5; i++ {        go querydb(dc, i)    }    fmt.Println("Main goroutine waiting...")    //time.Sleep(3*time.Second) // 可选:等待Goroutine完成,如果数据库操作时间不确定,则需要其他机制等待}

代码解释:

dbConn 结构体包含数据库连接和sync.WaitGroup,用于管理Goroutine的执行。openDb 函数打开数据库连接并返回 dbConn 实例。close 方法使用 dc.wg.Wait() 等待所有 Goroutine 完成后,再关闭数据库连接。querydb 函数在执行数据库操作前使用 dc.wg.Add(1) 增加计数器,操作完成后使用 defer dc.wg.Done() 减少计数器。main 函数启动多个 Goroutine 执行 querydb 函数,最后使用 defer dc.close() 关闭数据库连接。

这种方法确保所有 Goroutine 完成数据库操作后,再关闭数据库连接,避免了数据丢失和错误。 记住替换示例代码中的数据库连接字符串和驱动。 如果数据库操作时间不可预测,可能需要更复杂的机制来等待所有Goroutine完成,例如使用channel进行信号通知。

以上就是如何在Go语言中正确关闭多个Goroutine共享的数据库连接?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1386588.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月15日 06:27:03
下一篇 2025年12月15日 06:27:08

相关推荐

发表回复

登录后才能评论
关注微信