标准答案
- 应用通常共享一个 sql.DB,由它管理连接池,不应每次请求 Open 一个新池。
- 事务中使用 Tx 的操作保持在同一事务边界,Commit 或 Rollback 必须有明确路径。
- Rows 要关闭并处理迭代错误,查询 context 取消时应释放连接。
- MaxOpenConns、MaxIdleConns、ConnMaxLifetime 等配置要与数据库和实例数量匹配。
题目解析
sql.DB 是并发安全的连接池句柄,通常在进程启动时创建并在停机时关闭;Conn 才是固定连接,Tx 绑定事务连接,Rows 持有查询结果和连接资源。
事务函数要在成功 Commit 后返回成功,失败路径用 defer Rollback 兜底;Rows 要 Close 并检查 rows.Err,否则连接可能长期不能归还。
MaxOpenConns、MaxIdleConns 和 ConnMaxLifetime 要按数据库总连接、实例数、查询时长和故障扩容计算。DB 池等待与数据库锁/慢 SQL 要通过指标和 trace 区分。
常见误区
- 误区:每个请求结束都 DB.Close。改正:共享 sql.DB,在进程生命周期结束时关闭。
- 误区:事务返回前没有 rollback 兜底。改正:事务开始后注册 defer Rollback,Commit 成功后让其成为无害操作。
- 误区:Rows 不 Close。改正:立即 defer rows.Close,并检查 rows.Err 以保证连接归还。