Golang数据库连接池
我在使用Golang开发项目时需要连接MySQL数据库,想请教下关于数据库连接池的最佳实践。目前遇到几个问题:1) 如何合理设置连接池的最大连接数和空闲连接数?2) 连接池长时间运行后出现连接泄漏该怎么排查?3) 有没有推荐的第三方连接池库,还是标准库的database/sql就够用了?4) 在高并发场景下,连接池配置有哪些需要特别注意的优化点?希望有经验的朋友能分享下实际项目中的解决方案。
2 回复
Golang中可使用database/sql包自带连接池,无需额外配置。通过SetMaxOpenConns、SetMaxIdleConns等方法控制连接数。推荐搭配具体数据库驱动如pq(PostgreSQL)或go-sql-driver/mysql使用。
更多关于Golang数据库连接池的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中,数据库连接池用于管理数据库连接,提高性能并减少资源开销。标准库database/sql内置连接池功能,以下是关键点及示例:
核心特性:
- 自动管理:无需手动创建,
sql.Open()初始化后自动维护连接池。 - 连接复用:执行查询时从池中获取空闲连接,完成后放回。
- 并发安全:支持多协程同时使用。
关键配置参数(通过DB.SetXxx方法设置):
SetMaxOpenConns():最大打开连接数(默认无限制)。SetMaxIdleConns():最大空闲连接数(默认2)。SetConnMaxLifetime():连接最长存活时间。
示例代码:
package main
import (
"database/sql"
"fmt"
"time"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 初始化连接池
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
if err != nil {
panic(err)
}
defer db.Close()
// 配置连接池参数
db.SetMaxOpenConns(20) // 最大连接数
db.SetMaxIdleConns(10) // 最大空闲连接数
db.SetConnMaxLifetime(time.Hour) // 连接超时时间
// 使用连接池查询
var name string
err = db.QueryRow("SELECT name FROM users WHERE id=1").Scan(&name)
if err != nil {
panic(err)
}
fmt.Println("Query result:", name)
}
注意事项:
- 使用后务必调用
rows.Close()或stmt.Close()释放资源。 - 不同数据库需加载对应驱动(如MySQL使用
_ "github.com/go-sql-driver/mysql")。 - 合理设置连接数,避免过高导致数据库压力或过低影响性能。
通过内置连接池,Golang能高效处理数据库并发请求,开发者只需关注业务逻辑即可。

