Rails 4.0 PG::UnableToSend сокет не открыт
В настоящее время я пытаюсь обновить приложение Rails 3.2 до Rails 4.0.13 (ruby 2.3.5, PostgreSQL 9.4.13) и получаю эту ошибку при запуске интеграционных тестов;
: PG::UnableToSend at /companies/get_current_firm
: ===============================================
:
: > socket not open
:
:
: activerecord (4.0.13) lib/active_record/connection_adapters/postgresql_adapter.rb, line 798
: -------------------------------------------------------------------------------------------
:
: ``` ruby
: 793 end
: 794
: 795 FEATURE_NOT_SUPPORTED = "0A000" #:nodoc:
: 796
: 797 def exec_no_cache(sql, binds)
: > 798 @connection.async_exec(sql, [])
: 799 end
: 800
: 801 def exec_cache(sql, binds)
: 802 stmt_key = prepare_statement sql
: 803
: ```
Этот интеграционный тест регистрируется, а затем поступает ряд вызовов из внешнего интерфейса (AngularJS), чтобы получить подробности, такие как текущая выбранная фирма и т. Д. Каждый из этих вызовов получает одно и то же сообщение, как будто соединение было отключено. Я использую браузер Chrome через селен и капибару в режиме LIVE, чтобы я мог видеть, что происходит.
Вот мой файл database.yml для теста
test: &test
adapter: postgresql
encoding: unicode
database: test_<%= ENV['USER'] %><%= ENV['TEST_ENV_NUMBER'] %>
pool: 5
username: <%= ENV['DATABASE_USER'] %>
password: <%= ENV['DATABASE_PASSWORD'] %>
Вот звонок, который он делает с внешнего интерфейса
AngularJS
current_firm: (scope) ->
$http({method: 'GET', url: '/companies/get_current_firm'}).success (data) ->
scope.current_firm = data['firm']
Rails Controller
def get_current_firm
render json: {firm: current_firm.organisation}
end
Существует три отдельных вызова для получения разных данных, когда пользователь входит в систему, иногда в тестах он получает 1 или 2 из них, но не три.
Я попытался обойти это с http://www.ruby-railings.com/en/rails/postgresql/2014/01/11/connection-problems-in-rails-4.html. Это не решило проблему вообще.
Обновить
Когда пользователь входит в систему, из AngularJS в серверную часть Rails срабатывают три http-вызова. Если я выделю два вызова, то этот вызов будет работать каждый раз. Если я укажу только один, поэтому у нас два вызова, то он не будет выполнен ни один, ни оба вызова. Я получаю сообщение "в ожидании" на одном из вызовов.
1 ответ
Я работал, что это проблема AngularJS, отправляющая слишком много запросов в Rails 4 одновременно. Чтобы решить проблему, я помещаю каждый звонок в обещание.