Что вызывает таинственные зависания темы в Colfusion -> mysql communication

Одна из наиболее интересных "особенностей" Coldfusion - это то, как он обрабатывает внешние запросы. Основная суть в том, что когда запрос сделан к внешнему источнику через <cfquery> или любой другой внешний запрос, подобный тому, что он передает внешний запрос определенному драйверу, и в этот момент сам CF не может его приостановить. Даже если тайм-аут указан в запросе или в настройке cfsetting, он полностью игнорируется для всех внешних запросов.

http://www.coldfusionmuse.com/index.cfm/2009/6/9/killing.threads

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

  1. Зависший поток отображается в CF и не может быть уничтожен из FusionReactor.
  2. В MySQL нет видимого зависшего потока и нет активного запущенного запроса (просто обычный спящий режим).
  3. База данных отвечает на другие вызовы и, кажется, работает правильно.
  4. Максимальные соединения не были достигнуты ни для БД, ни для пользователя.

Мне кажется, единственный вероятный кандидат - это то, что как-то 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

Другие вопросы по тегам