当我从mysql切换到mysqli驱动程序时,我得到太多的连接错误。为什么?

时间:2014-05-20 20:26:56

标签: codeigniter mysqli

为什么我收到太多连接错误:

  

消息:mysqli_connect():( 08004/1040):连接太多

切换时
$db['default']['dbdriver'] = 'mysql';

$db['default']['dbdriver'] = 'mysqli';

在codeIgniter的db配置文件中? ?

这表明mysqli驱动程序没有正确关闭所有连接?

更新

切换db驱动程序时出现的连接太多似乎不是正确的原因(如答案中所示)

我查看了我的客户端网络托管公司,他们已将max_user_connections设置为40(不,不令人印象深刻 - 但我基本上只想使用group_concat列出具有值的用户)。

$this->db->select('u.id AS user_id, u.first_name, 
u.housenr, u.address, u.phone, u.garage_nr, u.parking_nr, 
u.standing_correction, u.email, u.note, GROUP_CONCAT(wc.consumption) AS consumption, 
GROUP_CONCAT(wc.id) AS consumption_id, GROUP_CONCAT(wc.consumption_date) AS 
consumption_date, GROUP_CONCAT(wc.working_meetings) AS working_meetings, 
GROUP_CONCAT(wc.nrof_garage) AS nrof_garage, GROUP_CONCAT(wc.nrof_parking) AS nrof_parking, GROUP_CONCAT(wc.correction) AS correction, , 
GROUP_CONCAT(wc.correction_refers) AS correction_refers')->from('water_consumption wc');
$this->db->join('user u', 'u.id = wc.user_id');        
$this->db->join('role r', 'u.role_id = r.id');
$this->db->where('r.name', 'member'); //Only users with members-role        
$this->db->group_by('u.id'); 
$this->db->order_by('LENGTH(housenr), housenr, first_name'); //Natural sorting
$this->db->order_by('consumption_date', 'desc');

$q = $this->db->get();
if ($q->num_rows() > 0) {            
    $res = $q->result('Water_consumption');
    //more code...

这真的很奇怪,但在使用时似乎每个返回的对象使用一个连接

$res = $q->result('Water_consumption');

这是我的假设,因为创建了大约40个对象,并且max_user_connections设置为40。

但使用时

$res = $q->result();

它似乎没有使用那么多的连接并显示模板(错误但因为它为每个耗水量对象调用了函数)。

这适用于我的本地wamp而没有任何问题,并且返回所有对象(大约60个)大约需要2-3秒。

2 个答案:

答案 0 :(得分:1)

如果应用程序正确关闭连接,MySQL基本上不关心。它有一个系统变量wait_timeout,任何在指定的秒数内没有任何事情发生的连接将自动关闭。 (但默认值似乎是28800 seconds,这应该远远超过任何Web应用程序的需要。您可能希望测试降低值。)

也许您不小心将persistent connections用于MySQLi by specifying the hostname with a preceding p:You can also trigger Codeigniter to use persistent connections by specifying an option.也许你没有考虑到后果就这样做了? 使用持久连接可以更快地超出限制。我建议在链接问题的接受答案中提出建议:默认情况下不要使用持久连接。

您是否简要估算了应用程序使用的连接? (一次最多可以进行多少个php进程或Web服务器进程+ cronjobs。)可能你的max_connections限制一直太低,但到目前为止这并没有在错误消息中显示出来。 (无论出于何种原因......)

答案 1 :(得分:1)

有时最明显的答案是盯着你 ...

我说过

$res = $q->result('Water_consumption');

每次都会建立连接。

但使用时

$res = $q->result();

它没有。

事实证明,每个Water_consumption都是从另一个用于处理登录内容的连接类扩展而来的。那个班级正在建立联系,所以

$res = $q->result('Water_consumption');
包含两个对象的

将建立两个连接。

但这里也会发生同样的事情......

$x = new Water_consumption;
$x = new Water_consumption;

这也会创建两个连接。