我使用MySQL 5.0是由GoDaddy的(Linux版)托管的网站。
我在做我的web应用程序一些测试,突然我注意到页面被刷新真的慢。 最后,经过漫长的等待,我得到了一个页面,说一起“MySQL错误,连接太多......”东西线,并指出,其连接到数据库我的config.php文件。
它刚刚被我连接到数据库,没有其他用户。 在每一个我的网页,我包括在顶部的config.php文件,并关闭在页面末尾的MySQL连接。 有可能是之间的几个疑问。 我怕我不关闭MySQL连接不够(mysql_close())。
然而,当我尝试运行一个查询后关闭它们,我收到了网页上连接错误。 我的页面是PHP和HTML。 当我尝试关闭查询时,似乎下一个将无法连接。 我必须包括的config.php为了收盘后再次连接?
这个错误把我吓坏了,因为在2周,约84人开始使用该Web应用程序。
谢谢。
编辑:
这里是我的网页的一些伪代码:
require_once('../scripts/config.php');
<?php
mysql_query..
if(this button is pressed){
mysql_query...
}
if(this button is pressed){
mysql_query...
}
if(this button is pressed){
mysql_query...
}
?>
some html..
..
..
..
..
<?php
another mysql_query...
?>
some more html..
..
..
<?php mysql_close(); ?>
我计算过,这样,每个页面打开时间,打开连接,然后在页面加载完成连接关闭。 然后,连接再次打开时,有人点击页面上的按钮,等等...
编辑:
好了,所以我刚下车的电话与GoDaddy。 很显然,我的经济套餐,我仅限于一次50个连接。 虽然今天我的问题发生了,只有我访问该网站,他们说,他们有早期的一些服务器的问题。 不过,看到我如何将有84个用户对于我的web应用程序,我也许应该升级为“豪华”,它允许在同一时间100个连接。 在某一天,可能有大约30个用户同时访问我的网站,所以我觉得100是一个更安全的赌注。 难道你们同意吗?
共享托管服务提供商通常允许同一用户同时连接的一个非常小的量。
你的代码的作用是:
- 打开与MySQL服务器的连接
- 做到这一点的东西(生成页面)
- 收于页面端的连接。
最后一步,当在页面的最后做的是不是强制性的 :(报价mysql_close
手册):
使用mysql_close()通常是不必要的,因为非持久打开链接在脚本执行结束时自动关闭。
但要注意,你可能不应该反正使用永久连接...
两个小技巧:
- 使用
mysql_connect
的INSEAD mysql_pconnect
(已经为您确认) - 的mysql_connect设置为false的第四个参数(你已经确定,因为它是默认值):(报价手册):
如果第二个电话是对mysql_connect()使用相同的参数,没有新的链接将被建立,而是已经打开的链接的链接标识将被退回。
参数new_link改变此行为并使mysql_connect()总是打开新的连接,甚至当mysql_connect()函数是与以前相同的参数调用。
什么会导致这个问题呢?
也许你正在试图访问并行多个页面(使用多标签浏览器,例如),这将使用本网站的同时模拟多个用户?
如果您在使用的同时该网站之间的代码,很多用户mysql_connect
和关闭连接需要大量的时间,这将意味着在同一时间被打开很多连接......你会达到极限: - (
不过,因为你的应用程序的唯一用户,考虑到你有最多允许200个并发连接,有回事一些奇怪...
好了,想着“ 太多的连接 ”和“ max_connections
” ...
如果我没有记错, max_connections
不限制你可以打开与MySQL服务器的连接数,但可以开博到该服务器连接的总数 , 由任何人连接到它 。
引用关于MySQL的文档的连接太多 :
如果您在尝试连接到mysqld服务器得到一个连接太多的错误,这意味着所有可用的连接都在被其他客户使用。
允许由MAX_CONNECTIONS系统变量控制连接的数量。 它的默认值是100。如果你需要支持更多的连接,你应该为这个变量设置一个较大的值。
所以,实际上,这个问题可能不是来自于你和你的代码(这看起来不错,实际上):它可能“仅仅”是,你是不是唯一一个试图连接到MySQL服务器(记住,“共同主办”) ,而且有太多的人在使用它的同时...
...... 如果我是对的,那就是 ,有什么可以做,来解决这个问题:只要有该服务器上有太多的数据库/用户和max_connection
设置为200,你会继续痛苦.. 。
作为一个旁注:要回GoDaddy的前询问他们有关,这将是很好,如果有人可以验证我刚才说的^^
我有大约18个月处理这个问题( http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections-error/ )
我的解决方案(将适用于你)到底依次为:
- 调根据数据库MySQLTuner 。
- 每周进行碎片整理在此基础上的表后
从后整理bash脚本:
#!/bin/bash
# Get a list of all fragmented tables
FRAGMENTED_TABLES="$( mysql -e `use information_schema; SELECT TABLE_SCHEMA,TABLE_NAME
FROM TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql') AND
Data_free > 0` | grep -v '^+' | sed 's,t,.,' )"
for fragment in $FRAGMENTED_TABLES; do
database="$( echo $fragment | cut -d. -f1 )"
table="$( echo $fragment | cut -d. -f2 )"
[ $fragment != "TABLE_SCHEMA.TABLE_NAME" ] && mysql -e "USE $database;
OPTIMIZE TABLE $table;" > /dev/null 2>&1
done
请确保您不使用持久连接。 这通常是一个坏主意..
如果你已经有了..充其量,你需要为你的Apache进程,以支持一样多的连接。 您是否能够改变max_connections的设置?
你完全确保数据库服务器完全奉献给你?
登录到datbase为根,用“SHOW PROCESSLIST”,看看谁的连接。 理想的情况是这个勾到你的监控系统,查看有多少个连接有随着时间的推移和报警,如果有太多。
最大的数据库连接可以在my.cnf中进行配置,但要小心跑出来的内存或地址空间。
如果你有shell访问,用netstat看看有多少插座打开你的数据库和他们来自哪里。
在Linux上,键入:
netstat -n -a |grep 3306
在Windows上,键入:
netstat -n -a |findstr 3306
该解决方案的这些可能的,我遇到了这个在MCQA测试,即使我不明白哪一个是正确的!
在设置该my.cnf中“设定变量= MAX_CONNECTIONS = 200”
执行命令 “SET GLOBALmax_connections = 200”
始终使用的mysql_connect()函数,以便连接到MySQL服务器
始终使用mysql_pconnect()函数,以便连接到MySQL服务器
以下是可能的解决方案:
1)通过在MySQL设置全局变量增加最大连接设置。
set global max_connection=200;
注意:它会增加服务器负载。
2),如下清空连接池:
FLUSH HOSTS;
3)检查您PROCESSLIST并杀死特定的processlist如果你不希望任何人。
你可以参考如下: -
文章链接