codeigniter多数据库连接应通过基类统一管理,核心是封装connect_to()方法、缓存实例、校验参数并显式关闭连接,子控制器继承后按需调用,配合模型层可进一步解耦职责。

CodeIgniter 多数据库连接用基类统一管理,核心是把连接逻辑抽离到一个可复用的父控制器或服务类中,避免每个控制器重复写加载逻辑、校验和错误处理。关键不在于“多”,而在于“统一”——让所有子类按需调用、安全复用、便于维护。
设计一个数据库连接基类
在 app/Controllers/BaseController.php(或新建如 app/Controllers/DbAwareController.php)中定义基类,封装动态连接能力:
- 提供 protected 方法如 connect_to($config),接收主机、库名、账号密码等参数,构建配置数组并返回
$this->load->database($config, TRUE)实例 - 支持缓存已建立的连接,例如用
protected $db_instances = [];按配置哈希键存储,避免重复连接同一目标 - 内置基础校验:非空判断、PDO/Mysqli 驱动兼容性提示、连接失败时抛出异常或返回 FALSE
子控制器继承并按需调用
业务控制器继承该基类后,无需关心底层细节,直接调用即可获得隔离的数据库实例:
-
使用默认库:仍可用
$this->db(CI 自动加载的 default) -
连接外部库:传入用户输入的凭证数组,获取独立实例:
$ext_db = $this->connect_to([<br> 'hostname' => '192.168.1.100',<br> 'username' => 'import_user',<br> 'password' => 'xxx',<br> 'database' => 'legacy_data'<br>]);
- 后续操作完全独立:
$ext_db->select('*')->from('users')->get()->result(),不影响主库状态
配合模型层做进一步解耦
若业务复杂,建议将连接逻辑下沉至模型或专用服务类,控制器只负责传递参数:
- 创建 app/Models/ExternalDbModel.php,构造函数接收连接配置,内部调用
$this->db = $this->connect_to($config) - 控制器中只需:
$model = new ExternalDbModel($user_input); $data = $model->fetch_users(); - 这样既保持控制器轻量,又让数据库职责边界清晰,方便单元测试和替换驱动
注意连接生命周期与资源释放
CodeIgniter 不自动关闭手动加载的数据库连接,尤其在长流程或循环导入中容易堆积:
- 在基类中补充 close_db($key) 方法,调用
$db_instance->close() - 推荐在业务逻辑结束后显式关闭,比如导入完成或异常退出前:
if (isset($ext_db)) $ext_db->close(); - 避免在 __destruct() 中统一关——CI 的请求生命周期短,且可能因异常跳过析构











