首页 > 后端开发 > Golang > 正文

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

碧海醫心
发布: 2025-03-23 11:18:23
原创
897人浏览过

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

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

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

问题分析:

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

解决方案:

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

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

示例代码:

package main

import (
    "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 finished\n", 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完成,如果数据库操作时间不确定,则需要其他机制等待
}
登录后复制

代码解释:

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

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

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

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号