会,多数据库配置本身不增加连接数,真正导致连接数上升的是同时打开多个活跃连接且未释放;codeigniter 的数据库配置仅在首次调用 load->database() 时触发连接,重复加载同名库(不加 true)会复用实例,而滥用 true、未赋值、未 unset 或 cli 长期持有等行为才会实质性增加连接数。

会,但不是“自动多占”,而是取决于你 怎么用 —— 多数据库配置本身不增加连接数,真正导致连接数上升的是 同时打开多个活跃连接且未释放。
多数据库配置不等于多连接
CodeIgniter 的 $db['default'] 和 $db['second_db'] 只是配置数组,不会在框架启动时自动建立连接。连接只在首次调用 $this->load->database() 时触发。
- 只加载
default:仅 1 个连接 - 加载
default+ 显式加载second_db:最多 2 个连接(前提是两者都处于活跃状态) - 重复调用
$this->load->database('second_db')而不加TRUE:仍为 1 个连接(CI 会复用已有实例)
真正让连接数飙升的几种情况
以下操作会让连接数实质性增长,且容易被忽略:
-
每次请求都新建连接而不复用:比如在循环里反复调用
$this->load->database('log_db', TRUE)却没赋值给变量,导致 CI 每次都新建实例(即使底层 socket 相同,PHP 对象层仍算独立连接资源) -
加载后未及时释放:CI 不提供
close()方法,但你可以用unset($this->second_db)主动销毁对象引用,配合 PHP 垃圾回收降低资源滞留 -
在 CLI 命令中长期持有多个库实例:例如一个定时任务同时连主库、日志库、统计库并持续运行几分钟,每个库占用一个持久连接(尤其开启
pconnect = TRUE时) -
错误地用了
TRUE却没接住返回值:$this->load->database('api_db', TRUE)返回新实例,若不赋值给变量(如$api_db = ...),该实例可能无法被后续代码访问,但连接已建立且暂未关闭
如何控制连接数不翻倍
关键不是“少配库”,而是“按需拿、用完放”:
- 只在真正需要时加载第二个库,用完即弃:
$log_db = $this->load->database('log_db', TRUE); $log_db->insert(...); unset($log_db); - 避免在模型或库类中隐式加载多个库——统一由控制器协调,明确连接生命周期
- 检查 MySQL 实际连接数:
SHOW STATUS LIKE 'Threads_connected';,再对比你的应用逻辑,确认是否真由多库引起,还是连接泄漏或长事务占着不放 - 生产环境建议把
pconnect设为FALSE:虽然稍慢一点,但能确保请求结束就断开,防止连接堆积
多数据库本身是中性设计,连接数问题从来不在“配了多少”,而在“开了几个、开着多久、关没关掉”。











