ActiveRecord :: ConnectionNotEstablished ошибка (нетерпеливая загрузка?) - PullRequest
5 голосов
/ 13 октября 2011

Я занимаюсь разработкой на OSX и развертыванием на Linux.Мои среды:

Разработка:

OSX Lion
Ruby 1.9.2p180
ActiveRecord 3.0.9
PostgreSQL 9.0

Тест:

Ubuntu Server 11.04
Ruby 1.9.2p290
ActiveRecord 3.1.1
PostgreSQL 9.1

Следующие части кода работают на OSX, но не на Linux:

ei_doc_type = TaxDoc::Model::DocType.find_by_doc_type("EI")
doc_version = ei_doc_type.doc_versions.find_by_doc_version(edoc.version)
customer.electronic_invoices.create(....)

и:

ei_doc_type = TaxDoc::Model::DocType.find_by_doc_type("EI")
ei_doc_type.doc_versions.each { |doc_version|
  @mappings[doc_version.doc_version] = Hash.new
  doc_version.mappings.each { |mapping|
    @mappings[doc_version.doc_version][mapping.column_name] = mapping.xml_element
  }
}

Когда я пытаюсь запустить любой из этих кусков кода в Linux, я получаю следующую ошибку:

.../connection_pool.rb:409: in `retrieve_connection': ActiveRecord::ConnectionNotEstablished (ActiveRecord::ConnectionNotEstablished)

Я изменил код, и онработает в Linux:

ei_doc_type = TaxDoc::Model::DocType.find_by_doc_type("EI")
doc_versions = TaxDoc::Model::DocVersion.where(:doc_type_id => ei_doc_type.id, :doc_version => edoc.version)
doc_version = doc_version.first
customer.electronic_invoices.create(....)

и:

ei_doc_type = TaxDoc::Model::DocType.includes(:doc_versions => :mappings).find_by_doc_type("EI")
ei_doc_type.doc_versions.each { |doc_version|
  @mappings[doc_version.doc_version] = Hash.new
  doc_version.mappings.each { |mapping|
    @mappings[doc_version.doc_version][mapping.column_name] = mapping.xml_element
  }
}

Кажется, что активная загрузка для ассоциаций первого порядка не работает в тестовой среде и в первом примере.Даже если я использую «include», он не работает.

Есть ли разница между версиями ActiveRecord или PostgreSQL, которые могут быть причиной этого?

Это мои модели:

class DocType < EDocsDatabase
  has_many :doc_versions, :dependent => :destroy
  has_many :mappings, :through => :doc_versions
  has_many :service_types
end

class DocVersion < EDocsDatabase
  belongs_to :doc_type
  has_many :mappings, :dependent => :destroy
end

class Mapping < EDocsDatabase
  belongs_to :doc_version
end

1 Ответ

0 голосов
/ 08 сентября 2013

В каком контексте вы используете этот код?

Причина в том, что в настоящее время ActiveRecord требует некоторого управления пулом соединений, если вы выполняете свой код в цикле ответа (как на сервере).Rails решает эту проблему с помощью промежуточного программного обеспечения, которое управляет AR-соединениями за пределами вашего основного респондента приложения.Однако, если у вас нет такой оболочки, у вас могут быть подпрограммы других приложений, «ступающие» в ваш пул соединений, особенно при использовании многопоточных серверов.

...