我正在使用MySQL 5.0来访问由GoDaddy(linux)托管的网站。
我正在对我的网络应用进行一些测试,突然之间我注意到这些页面的刷新速度非常慢。最后,经过漫长的等待,我到了一个页面,上面写着“MySQL错误,连接太多......”的内容,它指向我连接数据库的config.php文件。
我刚刚连接数据库,没有其他用户。在我的每个页面上,我在顶部包含config.php文件,并关闭页面末尾的mysql连接。两者之间可能存在多个查询。我担心我没有足够关闭mysql连接(mysql_close())。
但是,当我在运行查询后尝试关闭它们时,我在页面上收到连接错误。我的页面是PHP和HTML。当我尝试关闭查询时,似乎下一个查询将无法连接。我必须在收盘后再次包含config.php以便连接吗?
这个错误吓到了我,因为在2周内,大约有84人开始使用这个网络应用程序。
感谢。
编辑:
以下是我页面的一些伪代码:
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个用户,我应该升级到“Deluxe”,它允许一次100个连接。在某一天,可能有大约30个用户一次访问我的网站,所以我认为100将是一个更安全的赌注。你们同意吗?
答案 0 :(得分:31)
共享托管服务提供商通常允许同一用户进行少量的同步连接。
您的代码的作用是:
最后一步,在页面末尾完成时不是强制性 :(引用mysql_close
手册):
通常不使用mysql_close() 必要的,作为非持久的开放 链接自动关闭 脚本执行结束。
但请注意,你可能不应该使用持久连接......
两个提示:
mysql_connect
mysql_pconnect
(已经可以为你) 如果再次拨打电话 mysql_connect()与此相同 参数,没有新的链接 建立,但相反,链接 已打开链接的标识符 将被退回。
new_link 参数修改此行为和 使mysql_connect()始终打开一个 新链接,即使是mysql_connect() 以前叫过同样的 参数。
那会导致什么问题?
也许您正在尝试并行访问多个页面(例如,使用浏览器中的多个标签页),这将同时模拟几个使用该网站的用户?
如果有许多用户同时使用该网站,并且mysql_connect
与关闭连接之间的代码需要大量时间,则意味着会同时打开许多连接...并且你将达到极限: - (
尽管如此,由于您是该应用程序的唯一用户,考虑到您允许多达200个同时连接,因此有一些奇怪的事情......
好吧,想一想“连接太多”和“max_connections
”......
如果我没记错的话,max_connections
不会限制你可以打开MySQL服务器的连接数,但连接总数可以bo打开了该服务器,任何与之连接的人都 。
在Too many connections上引用MySQL的文档:
如果您获得太多连接 尝试连接到时出错 mysqld服务器,这意味着所有 可用的连接正在使用中 其他客户。
允许的连接数是 由max_connections控制 系统变量。它的默认值是 100.如果需要支持更多连接,则应设置更大的连接 此变量的值。
所以,实际上,问题可能不是来自你或你的代码(看起来很好,实际上):它可能“只是”你不是唯一一个试图连接到那个MySQL服务器(请记住,“共享主机”),并且有太多人同时使用它...
... 如果我是对的,那就是,你无法解决问题:只要该服务器上的数据库/用户太多而且{{ 1}}设置为200,你将继续痛苦......
作为旁注:在回到GoDaddy询问他们之前,如果有人可以验证我刚刚说的话会很好^^
答案 1 :(得分:3)
我有大约18个月的处理时间(http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections-error/)
我最终得到的解决方案(适用于你)是:
从帖子中对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
答案 2 :(得分:2)
确保您没有使用持久连接。这通常是一个坏主意..
如果你有这个...最多你需要支持与apache进程一样多的连接。你能改变max_connections设置吗?
答案 3 :(得分:2)
您是否完全确定数据库服务器完全专用于您?
以root用户身份登录数据库并使用“SHOW PROCESSLIST”查看谁已连接。理想情况下,将其连接到监控系统中,以查看一段时间内有多少连接,并在有太多连接时发出警报。
可以在my.cnf中配置最大数据库连接,但要注意内存或地址空间不足。
答案 4 :(得分:2)
如果您有shell访问权限,请使用netstat查看为您的数据库打开了多少个套接字以及它们来自何处。
在Linux上,输入:
netstat -n -a |grep 3306
在Windows上,输入:
netstat -n -a |findstr 3306
答案 5 :(得分:1)
解决方案可能是其中之一,我在MCQA测试中遇到过这个,即使我不明白哪一个是正确的!
在my.cnf中设置“set-variable = max_connections = 200”
执行命令“SET GLOBALmax_connections = 200”
始终使用mysql_connect()函数连接到mysql服务器
始终使用mysql_pconnect()函数连接到mysql服务器
答案 6 :(得分:0)
以下是可能的解决方案:
1)通过在mysql中设置全局变量来增加最大连接设置。
set global max_connection=200;
注意:这会增加服务器负载。
2)清空连接池,如下所示:
FLUSH HOSTS;
3)检查您的processList并删除特定的进程列表,如果您不想要任何进程列表。
你可以参考: -