我正考虑从自动加载文件中删除数据库库。我正在缓存页面上的所有内容,所以我不需要每次都连接到数据库,如果我有CI连接到数据库,我认为这是浪费速度。
我的问题现在是:如果我是在没有参数的MY_Model $this->load->database()
中加载数据库(它们来自配置文件),是否会为我在控制器中使用的每个模型建立新的连接?
或者它会像只加载一次的助手一样吗?
答案 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
和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);