CodeIgniter 3配置AWS Aurora读写分离后数据库连接数过高如何优化
问题根因
CodeIgniter 3 中调用$this->load->database('writer_instance', TRUE)时,第二个参数为TRUE代表每次调用都返回独立的新数据库连接实例。你在每个模型的构造函数中都执行一次该加载逻辑,单次请求如果加载了N个模型,就会为写库创建N个独立连接,这就是连接数大幅上涨的直接原因。
解决方案
方案1:自定义核心基础模型复用连接(推荐)
所有业务模型继承统一的核心基础模型,仅在核心模型中加载一次写库实例,全局复用。
- 在
application/core目录下创建MY_Model.php文件,代码如下:
<?php class MY_Model extends CI_Model { // 全局共用的写库连接实例 protected $db2; public function __construct() { parent::__construct(); // 仅首次调用时加载写库实例,后续直接复用 if (!isset($this->db2)) { $this->db2 = $this->load->database('writer_instance', TRUE); } } }
- 调整所有业务模型的继承逻辑,删除各模型构造函数中重复的写库加载代码,示例调整后代码:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class ActionModerator_model extends MY_Model { function __construct(){ parent::__construct(); } public function add($object) { $this->db2->insert( 'parameter_action' , $object ); } public function get($id_group) { $this->db->select('id, name'); $this->db->where( 'id_group' , $id_group ); $q = $this->db->get( 'user' ); $q = $q->result(); return $q; } }
方案2:钩子预加载全局实例
如果不想调整现有模型的继承关系,可通过CI钩子在请求初始化阶段一次性加载写库实例,全局可用。
- 先开启钩子功能,在
application/config/config.php中修改配置:
$config['enable_hooks'] = TRUE;
- 在
application/config/hooks.php中添加预加载逻辑:
$hook['pre_controller'] = function() { $CI =& get_instance(); $CI->db2 = $CI->load->database('writer_instance', TRUE); };
配置完成后,所有控制器、模型中都可以直接调用$this->db2,无需再重复加载写库。
额外优化建议
- 对于完全没有写操作的模型,可以不用加载写库实例,按需加载即可进一步降低连接消耗。
- 当前配置中
pconnect设为FALSE使用短连接,请求结束后连接会自动释放,如果流量较高也可以开启AWS Aurora的连接池功能,进一步优化连接占用情况。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

