ORM 与 database/sql 的关系、连接池配置
结论:gdb 建立在标准库 database/sql 之上:连接池由 database/sql 管理,gdb 负责方言适配与上层 ORM 语义;连接池参数在 database 配置节点配置,生产环境务必显式设置并让连接生命周期小于数据库侧超时。
一、关系说明
- 底层:gdb 通过 database/sql + 各驱动(MySQL、PostgreSQL、SQLite 等)执行 SQL,天然获得连接池、超时等标准能力。
- 上层:gdb 提供链式 API、类型映射、日志、软删除、事务等 ORM 语义,并针对不同数据库做方言适配。
- 未配置连接池参数时沿用 database/sql 的默认策略(如最大打开数不限制、空闲连接数很小),生产不可依赖默认值。
二、连接池参数(database 配置节点)
| 配置 | 含义 | 建议 |
|---|---|---|
| maxOpenConns | 最大打开连接数 | 按业务峰值评估,防打爆库 |
| maxIdleConns | 最大空闲连接数 | 与并发模型匹配 |
| connMaxLifetime | 连接最长存活时间(秒) | 小于 DB wait_timeout,如 30~60s |
| connMaxIdleTime | 空闲回收时间(秒) | 及时回收空闲连接 |
配置示例
database:
default:
link: "mysql:root:123456@tcp(127.0.0.1:3306)/demo?loc=Local&parseTime=true"
maxOpenConns: 100
maxIdleConns: 10
connMaxLifetime: 30
connMaxIdleTime: 30
常见追问 / 记忆点
- 追问:连接池被打满常见原因?→ 慢 SQL、长事务、连接泄漏(手写查询未归还)、并发突增;可结合 gdb 调试日志与库侧 processlist 排查(具体监控手段以官方文档为准)。
- 追问:为什么 connMaxLifetime 要小于 DB 超时?→ 避免池中连接已被服务端/防火墙断开后仍被复用,造成偶发“连接失效”。
- 记忆点:连接池是 sql.DB 的,gdb 只做上层封装;四参数显式配,Lifetime 短于库超时。