Codeigniter:多次使用$ this-> load-> database()会导致多个连接?

时间:2013-07-02 07:38:36

标签: php database performance codeigniter connection

我正考虑从自动加载文件中删除数据库库。我正在缓存页面上的所有内容,所以我不需要每次都连接到数据库,如果我有CI连接到数据库,我认为这是浪费速度。

我的问题现在是:如果我是在没有参数的MY_Model $this->load->database()中加载数据库(它们来自配置文件),是否会为我在控制器中使用的每个模型建立新的连接?

或者它会像只加载一次的助手一样吗?

4 个答案:

答案 0 :(得分:7)

他们只加载一次。数据库类为您确保这一点。

答案 1 :(得分:2)

不,您只会连接到一个数据库。您在database.php

中指定的那个

但是,您可以连接到多个数据库。 假设您在database.php中有两个连接,如下所示:

/* FORUM */
$active_group = "forum";
$active_record = TRUE;

$db['forum']['hostname'] = "xxxxx";
$db['forum']['username'] = "xxxxx";
$db['forum']['password'] = "xxxxx";
$db['forum']['database'] = "xxxxx";
$db['forum']['dbdriver'] = "mysql";
$db['forum']['dbprefix'] = "";
$db['forum']['pconnect'] = TRUE;
$db['forum']['db_debug'] = TRUE;
$db['forum']['cache_on'] = FALSE;
$db['forum']['cachedir'] = "";
$db['forum']['char_set'] = "utf8";
$db['forum']['dbcollat'] = "utf8_general_ci";

/* TEST SITE */
$active_group = "default";
$active_record = TRUE;

$db['default']['hostname'] = "xxxxx";
$db['default']['username'] = "xxxxx";
$db['default']['password'] = "xxxxx";
$db['default']['database'] = "xxxxx";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci"; 

您可以使用以下方式调用此数据库:

$this->db_forum = $this->CI->load->database('forum', TRUE);

$this->db

一样访问db1

和db2类似$this->db_forum

您可以查看CI文档以获取更多信息:http://ellislab.com/codeigniter/user-guide/database/connecting.html

我只是用了一个简单的例子。

希望它有所帮助。

答案 2 :(得分:1)

加载模型后,您可以使用:

$this->load->model('my_model', NULL, TRUE);

第三个参数将自己连接到数据库。

通过查看system/core/Loader.php

找到了这个

如果已设置$this->load->database();,则在同一文件中运行FALSE并在连接前返回$this->db,因此不必担心多个连接:

// Do we even need to load the database class?
if (class_exists('CI_DB') AND $return == FALSE AND $active_record == NULL AND isset($CI->db) AND is_object($CI->db))
{
    return FALSE;
}

答案 3 :(得分:0)

我的工作非常简单,我有一个站点,该站点根据登录用户名选择一个数据库,因此我有一个“主”数据库,其中包含动态可选数据库的信息。我做的方式是将这段代码放在需要更改数据库的位置,如下所示:

$db1['hostname'] = 'localhost';
$db1['username'] = $fila['dbusername'];
$db1['password'] = $fila['dbpass'];
$db1['database'] = $fila['dbname'];
$db1['dbdriver'] = 'mysqli';
$db1['dbprefix'] = 'ospos_';
$db1['pconnect'] = FALSE;
$db1['db_debug'] = TRUE;
$db1['cache_on'] = FALSE;
$db1['cachedir'] = '';
$db1['char_set'] = 'utf8';
$db1['dbcollat'] = 'utf8_general_ci';
$db1['swap_pre'] = '';
$db1['autoinit'] = TRUE;
$db1['stricton'] = FALSE;

$this->db->close();
$this->load->database($db1,FALSE);

如果您希望在选择数据库后将其永久保存,我建议使用会话变量并修改autoload.php文件,例如:

class DatabaseLoader {
     public function __construct() {
             $this->load();
     }
     public function load() {
        $CI =& get_instance();
        $may_db=$CI->session->userdata('may_db');
        if($may_db)
        {
            $CI->db = $CI->load->database($may_db, TRUE);
        }
        else
        {
            $CI->db = $CI->load->database('default', TRUE);
        } 
     }
}

并将数据库信息添加到代码第一部分的会话变量中:

$this->session->set_userdata('may_db',$db1);