revel 框架本身不管理数据库连接池,连接池由 database/sql 及底层驱动(如 go-sql-driver/mysql)控制;需在 sql.open 后、revel.registerdb 前显式调用 db.setmaxopenconns、db.setmaxidleconns 和 db.setconnmaxlifetime 设置参数,且配置须从 app.conf 手动读取并应用,不可直接写在 conf 中生效。

Revel 框架中数据库连接池由底层 driver 控制,不是 Revel 自身配置项
Revel 本身不管理数据库连接池,它只负责把 database/sql 的 *sql.DB 实例注入到控制器。真正控制连接池行为的是你用的数据库驱动(如 github.com/go-sql-driver/mysql 或 github.com/lib/pq),以及 Go 标准库 database/sql 提供的池参数。
如何设置 MaxOpenConns、MaxIdleConns 和 ConnMaxLifetime
必须在初始化 *sql.DB 后、注册进 Revel 之前显式调用对应方法。常见错误是漏掉这步,导致用默认值(MaxOpenConns=0 表示无限制,极易耗尽 MySQL 连接数)。
典型配置方式(以 MySQL 为例,在 app/init.go 中):
db, err := sql.Open("mysql", connString)
if err != nil {
panic(err)
}
db.SetMaxOpenConns(20) // 最大打开连接数
db.SetMaxIdleConns(10) // 最大空闲连接数
db.SetConnMaxLifetime(60 * time.Second) // 连接最长复用时间
revel.RegisterDB(db)
-
MaxOpenConns建议设为略高于应用峰值并发请求数(比如压测观察到最大活跃 DB 调用为 15,则设 20) -
MaxIdleConns不应超过MaxOpenConns,一般设为后者的 1/2 到 2/3 -
ConnMaxLifetime对 PostgreSQL 推荐设为 30–60 秒,MySQL 可设为 60–180 秒,避免连接被服务端 silent kill 后未检测导致的invalid connection错误
配置项写在哪?不能放在 conf/app.conf 里直接生效
Revel 的 app.conf 只负责框架级配置(如 run.mode、http.port),不解析数据库池参数。你得自己从配置文件读出数值再传给 db.Set* 方法。
例如,在 app/init.go 中:
maxOpen := revel.Config.IntDefault("db.maxopen", 20)
maxIdle := revel.Config.IntDefault("db.maxidle", 10)
lifeSec := revel.Config.Int64Default("db.lifetime.sec", 60)
<p>db.SetMaxOpenConns(maxOpen)
db.SetMaxIdleConns(maxIdle)
db.SetConnMaxLifetime(time.Duration(lifeSec) * time.Second)
</p>
然后在 conf/app.conf 加上:
[dev] db.maxopen = 20 db.maxidle = 10 db.lifetime.sec = 60
为什么改了配置没效果?检查这三个地方
常见失效原因不是代码写错,而是执行时机或作用对象不对:
- 调用
db.Set*前没有确保db是同一个实例(比如多次sql.Open创建了新对象) - 在
revel.RegisterDB(db)之后才调用Set*—— 此时 Revel 已完成注入,但池参数已按默认值初始化完毕 - 用的是旧版 Revel(RegisterDB 内部会自动调用
sql.Open,此时你无法干预;必须升级到 Revel v1+ 并手动管理*sql.DB
连接池大小是否生效,最直接验证方式是查 MySQL 的 SHOW STATUS LIKE 'Threads_connected';,配合压测看是否稳定在设定上限内。超过就说明 MaxOpenConns 没起作用,优先检查初始化顺序。











