为什么我收到太多连接错误:
消息: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秒。
答案 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;
这也会创建两个连接。