Что вызывает таинственные зависания темы в Colfusion -> mysql communication
Одна из наиболее интересных "особенностей" Coldfusion - это то, как он обрабатывает внешние запросы. Основная суть в том, что когда запрос сделан к внешнему источнику через <cfquery>
или любой другой внешний запрос, подобный тому, что он передает внешний запрос определенному драйверу, и в этот момент сам CF не может его приостановить. Даже если тайм-аут указан в запросе или в настройке cfsetting, он полностью игнорируется для всех внешних запросов.
http://www.coldfusionmuse.com/index.cfm/2009/6/9/killing.threads
Поэтому, имея в виду, проблема, с которой мы столкнулись, заключается в том, что каким-то образом связь между нашим CF-сервером и нашим сервером MySQL иногда прерывается и оставляет зависшие потоки. Они имеют следующие характеристики.
- Зависший поток отображается в CF и не может быть уничтожен из FusionReactor.
- В MySQL нет видимого зависшего потока и нет активного запущенного запроса (просто обычный спящий режим).
- База данных отвечает на другие вызовы и, кажется, работает правильно.
- Максимальные соединения не были достигнуты ни для БД, ни для пользователя.
Мне кажется, единственный вероятный кандидат - это то, что как-то CF делает запрос, mySQL отвечает на этот запрос, но с ответом, который CF игнорирует и продолжает держать поток открытым в ожидании ответа от mySQL. Это объясняет, почему в базе данных нет никаких признаков проблем, но CF держит поток открытым, ожидая таинственного ответа.
Обычно эти зависшие темы появляются случайным образом в других скриптах (например, при публикации комментария к новостной статье). Даже если один поток для этого сценария зависает, другие запросы для этого сценария будут проходить, что будет означать, что сценарий не обязательно является ошибочным, а скорее является условием, с которым сталкивался сценарий при его выполнении.
Мы запустили некоторый тест, чтобы определить, что это не ошибка, сгенерированная mysql max_connections... мы создали пользователя, дали ему 1 максимальное количество соединений, связали это соединение с запросом sleep(1000) и выполнили другой запрос. К сожалению, он правильно выдал ошибку, не генерируя зависший поток.
Итак, я остался на этом этапе, совершенно не зная, что происходит не так. Существует ли какой-либо другой лимит соединения или тайм-аут, который может привести к неправильной связи между серверами?
3 ответа
Короче говоря, но я полагаю, что причина была в обработке изображений Coldfusion CF8. Это было просто глючно, и теперь в CF9 я никогда не видел эту проблему снова.
У нас была похожая проблема с сервером MS SQL. Там основной причиной была известная проблема, в которой по какой-то причине сервер считает, что завершает работу, а поток зависает (хотя сервер, очевидно, не завершает работу).
Мы не смогли устранить проблему, но смогли уменьшить ее, отключив пулы соединений с БД и изменяя частоту обновления соединений. (Я думаю, что я правильно понял этот ярлык - у меня нет доступа к администратору при моей новой работе.) Оба находятся в свойствах соединения в Администраторе.
Просто примечание: проблема не полностью с CF. Проблема, по-видимому, затрагивает все приложения Java. Что никоим образом не уменьшает раздражение, которое я получаю от этого.
Одна из вещей, которую вы должны начать изучать - это аппаратное обеспечение между двумя серверами. Вполне возможно, что у вас есть маршрутизатор или мост или NIC, который отбрасывает случайные пакеты. Это может привести к тому, что блок mySQL подумает, что он выполнил задачу, в то время как CF-сервер сидит там и ждет ответа в течение неограниченного времени, создавая зависший поток.
У 3com есть некоторые подробности о тестировании на потерю пакетов: http://support.3com.com/infodeli/tools/netmgt/tncsunix/product/091500/c11ploss.htm