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 短于库超时。
笔记加载中…