2021-05-27 07:54:41
在Go语言中,正确关闭多个Goroutine共享的数据库连接需确保连接仅关闭一次且所有Goroutine完成操作后再关闭。以下是两种推荐方案及其实现细节:
方案一:使用sync.WaitGroup同步Goroutine通过sync.WaitGroup计数活跃的Goroutine,阻塞主Goroutine直到所有子任务完成,再安全关闭连接。
实现步骤:
代码示例:
package mainimport ( "sync")func main() { var wg sync.WaitGroup db := openDB() // 假设openDB()返回已初始化的数据库连接 defer db.Close() // 确保最终关闭 for i := 0; i < 10; i++ { wg.Add(1) go func(i int) { defer wg.Done() queryDB(db, i) // 共享db连接 }(i) } wg.Wait() // 阻塞直到所有Goroutine完成}func queryDB(db *DB, i int) { // 执行数据库查询操作}优点:
缺点:
将数据库连接定义为全局变量,由主Goroutine统一初始化与关闭,子Goroutine直接使用连接。
实现步骤:
代码示例:
package mainvar db *DB // 全局数据库连接func main() { db = openDB() // 初始化连接 defer db.Close() // 主Goroutine负责关闭 for i := 0; i < 10; i++ { go queryDB(i) // 直接使用全局db } // 等待所有Goroutine完成(可通过其他同步机制如channel) select {} // 示例:简单阻塞(实际需更完善的同步)}func queryDB(i int) { // 使用全局db执行查询}优化建议:
优点:
缺点:
通过以上方法,可安全关闭共享的数据库连接,平衡并发性能与资源管理。