У меня есть сайт, на котором запущено приложение rails, и работники resque, работающие в производственном режиме, на Ubuntu 9.10, Rails 2.3.4, ruby-ee 2010.01, PostgreSQL 8.4.2
Работники постоянно выдавали ошибки: PGError: сервер неожиданно закрыл соединение.
Мое лучшее предположение состоит в том, что основной процесс восстановления устанавливает соединение с БД (например, authlogic делает это при использовании User.acts_as_authentic), загружая классы приложений rails, и это соединение разрывается в процессе fork () ed (при выходе?), так что следующие разветвленные дети получат неработающий глобальный ActiveRecord :: Base.connection
Я мог бы воспроизвести очень похожее поведение с этим примером кода , имитирующим разветвление / обработку в resque worker. (AFAIK, пользователи libpq в любом случае рекомендуют воссоздавать соединения в разветвленном процессе, в противном случае это небезопасно)
Но странным является то, что когда я использую pgbouncer или pgpool-II вместо прямого соединения pgsql, такие ошибки не появляются.
Итак, вопрос в том, куда и как мне копать, чтобы узнать, почему он не работает для простого соединения и работает с пулами соединений? Или разумный обходной путь?