Я использую 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. По-видимому, с моим пакетом Economy я ограничился только 50 подключениями одновременно. Хотя моя проблема сегодня произошла, и только я обращался к сайту, они сказали, что раньше у них были проблемы с сервером. Однако, видя, что у меня будет 84 пользователя для моего веб-приложения, я, вероятно, должен перейти на «Делюкс», который позволяет одновременно устанавливать 100 подключений. В определенный день может быть около 30 пользователей, обращающихся к моему сайту за раз, поэтому я думаю, что 100 будет более безопасным. Вы, ребята, согласны?
Поставщики общих хостингов обычно допускают довольно небольшое количество одновременных подключений для одного и того же пользователя.
Что делает ваш код:
Последний шаг, когда это делается в конце страницы, не является обязательным : (цитируя mysql_close
):
Использование mysql_close () обычно не требуется, поскольку непостоянные открытые ссылки автоматически закрываются в конце выполнения скрипта.
Но обратите внимание, что вы, вероятно, не должны использовать постоянные подключения …
Два совета:
mysql_connect
insead mysql_pconnect
(уже ОК для вас) Если второй вызов выполняется с 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/ )
Решения, которые у меня были (что применимо к вам), в конце концов:
Дефрагментация сценария 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 как root и используйте «SHOW PROCESSLIST», чтобы узнать, кто подключен. Идеально подключите это в свою систему мониторинга, чтобы просмотреть, сколько подключений со временем и оповещения, если их слишком много.
Максимальные соединения с базой данных могут быть настроены в my.cnf, но следите за нехваткой памяти или адресного пространства.
Если у вас есть доступ к оболочке, используйте netstat, чтобы узнать, сколько сокетов открыто в вашей базе данных и откуда они взяты.
В Linux введите:
netstat -n -a |grep 3306
В окнах введите:
netstat -n -a |findstr 3306
Решение может быть одним из них, я столкнулся с этим в тесте MCQA, даже я не понял, какой из них прав!
Установите это в my.cnf "set-variable = max_connections = 200"
Выполните команду «SET GLOBALmax_connections = 200»
Всегда используйте функцию mysql_connect () для подключения к серверу mysql
Всегда используйте функцию mysql_pconnect () для подключения к серверу mysql
Возможны следующие решения:
1) Увеличьте максимальную настройку соединения, установив глобальную переменную в mysql.
set global max_connection=200;
Примечание. Это увеличит нагрузку на сервер.
2) Очистите пул соединений, как показано ниже:
FLUSH HOSTS;
3) проверьте свой список процессов и уничтожьте определенный список процессов, если вы не хотите их.
Вы можете сослаться на это:
ссылка на статью