MySQL Error “Слишком много соединений”

Да, это вообще плохо для вызова виртуального метода в конструкторе.

На данном этапе objet еще не может быть полностью создан, и инварианты, ожидаемые методами еще, не могут содержать.

21
задан littleK 30 July 2009 в 00:56
поделиться

5 ответов

Провайдеры общего хостинга обычно допускают довольно небольшое количество одновременных подключений для одного и того же пользователя.

Ваш код делает следующее:

  • открывает соединение с сервером MySQL
  • сделать это (создание страницы)
  • закрыть соединение в конце страницы.

Последний шаг, когда он выполняется в конце страницы, не является обязательным : (цитируя mysql_close ):

Использование mysql_close () обычно не необходимо, как непостоянное открытое ссылки автоматически закрываются в конец выполнения скрипта.

Но учтите, что вам, вероятно, все равно не следует использовать постоянные соединения ...

Два совета:

  • используйте mysql_connect вместо mysql_pconnect ( уже в порядке для вас)
  • Установите для четвертого параметра mysql_connect значение false (уже нормально для вас, так как это значение по умолчанию) : (цитируя руководство):

Если выполняется второй вызов к mysql_connect () с тем же аргументы, новой ссылки не будет установлен, но вместо этого ссылка идентификатор уже открытой ссылки будет возвращен.

Новая_ссылка параметр изменяет это поведение и заставляет mysql_connect () всегда открывать новая ссылка, даже если mysql_connect () был звонил раньше с тем же параметры.



В чем же тогда может быть проблема?

Возможно, вы пытаетесь получить доступ к нескольким страницам параллельно (например, используя несколько вкладок в браузере) , что будет имитировать использование нескольких пользователей веб-сайт одновременно?

Если у вас есть много пользователей, использующих сайт одновременно и код между mysql_connect и закрытием соединения занимает много времени, это будет означать, что многие соединения будут открыт одновременно ... И вы достигнете предела : - (

Тем не менее, поскольку вы единственный пользователь приложения, учитывая, что у вас разрешено до 200 одновременных подключений, есть что-то странное происходит ...



Ну, если подумать о « слишком много соединений » и « max_connections » ...

Если я правильно помню, max_connections не ограничивает количество соединений , которые вы можете открывать с сервером MySQL, но общее количество соединений , которые могут быть открыты для этого сервера, ] любым, кто подключается к нему .

Цитата из документации MySQL по Слишком много подключений :

Если вы получаете Слишком много подключений ошибка при попытке подключиться к mysqld, это означает, что все доступные соединения используются другие клиенты.

Разрешенное количество подключений контролируется max_connections системная переменная. Его значение по умолчанию 100. Если вам нужно поддерживать больше подключений, вы должны установить больший значение для этой переменной.

Таким образом, на самом деле проблема может исходить не от вас или вашего кода (который на самом деле выглядит нормально) : возможно, «просто», что вы не единственный, кто пытается для подключения к этому серверу MySQL (помните, «общий хостинг») , и что слишком много людей используют его одновременно ...

... И , если я ' m прав, и дело в том, что , вы ничего не можете сделать, чтобы решить эту проблему: пока на этом сервере слишком много баз данных / пользователей и что max_connection установлено на 200, вы будете продолжать страдать ...


В качестве примечания: прежде чем вернуться к GoDaddy и спросить их об этом, было бы неплохо, если бы кто-нибудь мог подтвердить то, что я только что сказал ^^

33
ответ дан 29 November 2019 в 20:28
поделиться

Убедитесь, что вы не используете постоянные соединения. Обычно это плохая идея ..

Если это у вас есть ... В лучшем случае вам нужно будет поддерживать столько же соединений, сколько у вас есть процессов apache. Можете ли вы изменить настройку max_connections?

2
ответ дан 29 November 2019 в 20:28
поделиться

Вы полностью уверены, что сервер базы данных полностью выделен для вас?

Войдите в базу данных как root и используйте «SHOW PROCESSLIST», чтобы увидеть, кто подключен. В идеале подключите это к своей системе мониторинга, чтобы увидеть, сколько подключений существует с течением времени, и предупредить, если их слишком много.

Максимальное количество подключений к базе данных можно настроить в my.cnf, но следите за нехваткой памяти или адресного пространства .

2
ответ дан 29 November 2019 в 20:28
поделиться

Если у вас есть доступ к оболочке, используйте netstat, чтобы узнать, сколько сокетов открыто в вашей базе данных и откуда они берутся.

В Linux введите:

netstat -n -a |grep 3306

В Windows введите:

netstat -n -a |findstr 3306
2
ответ дан 29 November 2019 в 20:28
поделиться

У меня было около 18 месяцев работы с этим (http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many- Connections-error/)

Решения, которые у меня были (которые могут быть применимы и к вам), в конце концов были следующими:

  1. настроить базу данных в соответствии с MySQLTuner.
  2. Дефрагментируйте таблицы еженедельно на основе этого сообщения

Дефрагментация скрипта 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
3
ответ дан 29 November 2019 в 20:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: