You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter 3配置AWS Aurora读写分离后数据库连接数过高如何优化

问题根因

CodeIgniter 3 中调用$this->load->database('writer_instance', TRUE)时,第二个参数为TRUE代表每次调用都返回独立的新数据库连接实例。你在每个模型的构造函数中都执行一次该加载逻辑,单次请求如果加载了N个模型,就会为写库创建N个独立连接,这就是连接数大幅上涨的直接原因。


解决方案

方案1:自定义核心基础模型复用连接(推荐)

所有业务模型继承统一的核心基础模型,仅在核心模型中加载一次写库实例,全局复用。

  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);
        }
    }
}
  1. 调整所有业务模型的继承逻辑,删除各模型构造函数中重复的写库加载代码,示例调整后代码:
<?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钩子在请求初始化阶段一次性加载写库实例,全局可用。

  1. 先开启钩子功能,在application/config/config.php中修改配置:
$config['enable_hooks'] = TRUE;
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:24:02