golang 操作 mysql, 查询单条(QueryRow)记录没有释放连接
1. mysql 连接配置
1、最大连接数为 1
2、最大空闲连接数 1
2. 当有查询连接一直没有释放,再来一个连接查询,程序会一直阻塞
func queryDemo() {
sqlStr := "select user_id, username, sex, email,prices from person where user_id=?"
var u person
// 非常重要:确保QueryRow之后调用Scan方法,否则持有的数据库链接不会被释放
row := db.QueryRow(sqlStr, 3)
row = db.QueryRow(sqlStr, 4)
err := row.Scan(&u.user_id, &u.username, &u.sex, &u.email, &u.prices)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("%+v", u)
}
// 这个例子演示一个数据库查询单条记录如果没有进行 scan操作,会导致下一条的数据库不能读
func main() {
queryDemo()
}
3、运行完这个程序,程序会一直卡主。
原因 mysql 最大连接数只有1个, row := db.QueryRow(sqlStr, 3) 这个连接由于没有 scan ,这个连接一直占着。
在来一个 row = db.QueryRow(sqlStr, 4) 需要申请一个连接,但是没有了,所以一直等待。
4、所以 单行查询 QueryRow 查询后一定要调用 scan, scan 中有一个 defer r.rows.Close() 会释放连接
5、完整代码地址 : https://github.com/lijiesheng/golang-mysql/tree/queryRow_not_scan/db/mysql/MaxOpenConns
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南