Это меня убивает. У нас есть приложение ASP.NET/Mono в базе данных MySQL.
В течение нескольких месяцев нас мучили совершенно случайные, но постоянные сообщения «Невозможно подключиться ни к одному из указанных хостов MySQL». Я ни в коем случае не профессионал по MySQL и надеюсь, что это что-то глупое.
Особенности:
MySQL 5.5.17
MySQL Connector/Net 6.4.4
Mono 2.10.8
MonoDevelop 2.8.6.5
Строка подключения: SERVER=localhost,3306;DATABASE=xxx;UID=xxx;PWD=xxx;CONNECTION TIMEOUT=90;Encrypt=false;
Max_connections
установлено значение 150. Никогда не бывает более 5 подключений, и все они активны (вероятно, из-за объединения).
Это приложение C # ASP.NET 3.5. На протяжении многих лет надежно работает на Windows / IIS. Девять месяцев назад наш рынок заставил нас отказаться от Windows, поэтому мы (я легко могу добавить) переместили все это на Mono / Apache.
Проблема возникает только на стороне Mono, но это критически важно, поскольку мы прекратили поддержку Windows.
В среднем происходит около 10 раз в час, но интервалы сильно различаются.
Проблема наблюдалась в следующих конфигурациях:
Ubuntu 11/Apache2/mod_mono
OSX Lion/Apacke2/mod_mono
Ubuntu 11/xsp2/MonoDevelop debug server
OSX Lion/xsp2/MonoDevelop debug server
Испортили keepalive, wait_timeout, connectionreset и т.д. безрезультатно. Сроки, кажется, не действуют. Ошибка возникает мгновенно на conn.open - не после тайм-аута соединения.
Вот подсказка - приложение абсолютно не будет работать с Pooling=false
. Почти все попытки подключения терпят неудачу. Конечно, я хочу использовать пул, но я не уверен, почему бы без него не работать.
В приложении есть встроенный «сердцебиение» (сессия пользователя в базе данных) - каждые 2 минуты.
Самый раздражающий из всех? Это абсолютно невозможно воспроизвести по запросу в работающей среде - это случайно. Я изучил размеры запросов, время выполнения и т. Д.
Я могу сделать это только в одном сценарии: при первоначальном запуске сервера Ubuntu или OSX, когда Mono впервые подключается к MySQL, это произойдет тогда. После этого остается только догадываться.
Благодаря хорошим советам здесь и в других местах я решил пару проблем.
1) независимо от того, что говорится в документации mysql, я не могу заставить "localhost" ссылаться на локальный файл сокета unix - он всегда обращается к tcp.
2) Я также заметил, что каждый сбой сопровождается записью «нет маршрута к хосту» в трассировке стека.
3) используя строку conn, подобную этой: «SERVER = / tmp / mysql.sock; DATABASE = xxx; UID = xxx; PWD = xxx;» и установив на моем сервере режим «пропуска сети», я смог заставить приложение запускаться на локальном сокете. Я проверил достаточно, чтобы убедиться, что проблема не возникает в сокете.
Выводы?
Я предполагаю, что возможно, что несколько разных экземпляров OSX и Ubuntu имеют случайные, нестабильные сетевые проблемы, вызывающие случайное «отсутствие маршрута для хоста». Я удивлен, что Connector / NET не является более устойчивым и, возможно, моно, поскольку мы никогда не видели его в Windows.
Окончательное решение? Я помещаю свою функцию подключения в цикл for. Теперь он будет 15 раз пытаться установить соединение, прежде чем потерпит неудачу. После нескольких часов тестирования я все еще вижу проблему, но для подключения никогда не требовалось более 11 попыток.
Мне не нравится этот ответ, но мне нужно двигаться дальше!