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