2011-10-13 18 views
6

Pracuję na OSX i wdrażam na Linuksie. Moje środowisko to:ActiveRecord :: ConnectionNotEstablished błąd (chętny ładowanie?)

Development:

OSX Lion 
Ruby 1.9.2p180 
ActiveRecord 3.0.9 
PostgreSQL 9.0 

Test:

Ubuntu Server 11.04 
Ruby 1.9.2p290 
ActiveRecord 3.1.1 
PostgreSQL 9.1 

Poniższe fragmenty prac kodu na OSX, ale nie w systemie 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(....) 

oraz:

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 
    } 
} 

Kiedy próbuję uruchomić każdy z tych fragmentów kodu w systemie Linux pojawia się następujący błąd:

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

Zmieniłem kod i działa na systemie 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(....) 

oraz:

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 
    } 
} 

Wygląda na to, że bardzo wcześnie ładuje się skojarzenia pierwszego rzędu w środowisku testowym, a w pierwszym przykładzie. Nawet jeśli użyję "obejmuje", to nie działa.

Czy istnieje różnica między wersjami ActiveRecord lub PostgreSQL, które mogą być przyczyną tego?

To są moje modele:

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 
+0

, aby upewnić się, że nie jest to Twoja wersja, zamień połączenie z bazą danych i poproś wersję DEV o rozmowę z bazą danych TEST. Musisz ponownie skonfigurować (i upewnić się, że porty są otwarte!), Ale przynajmniej wiesz, czy to może spowodować. Możesz także zrobić to wersetem (spraw, aby TEST był połączony z DEV). – Roger

+1

mówisz "rozwój" i "test" w swoich konfiguracjach, czy naprawdę masz na myśli twórcę i produkcję? Dwa wymienione środowiska mają różne wersje AR. Wydaje mi się mało prawdopodobne, że jest to problem związany z linuxem i OS X, a bardziej prawdopodobne jest to, że używasz różnych wersji ActiveRecord w dwóch środowiskach i masz do czynienia z błędem lub dziwnym przypadkiem krawędzi w jednym z nich. Pierwszym krokiem jest użycie tej samej wersji ActiveRecord w obu (co nie powinno być trudne, czy nie używasz Gemfile.lock sam między nimi? Powinieneś być). Gdy już to zapewnisz, wróć ponownie. – jrochkind

+0

@jrochkind to naprawdę dev i test. ale wskazałeś mi coś, czego nie zauważyłem: AR, Ruby i PostgreSQL mają różne wersje. sprawdzę to i spróbuję naprawić wersje. dzięki za wskazanie mi tego. – Ecil

Odpowiedz

0

Co kontekst używasz ten kod?

Powodem jest - aktualnie ActiveRecord wymaga pewnego zarządzania pulą połączeń, jeśli uruchamiasz swój kod w pętli odpowiedzi (jak na serwerze). Railsy adresują to za pomocą oprogramowania pośredniczącego, które zarządza połączeniami AR poza główną odpowiedzią aplikacji. Jeśli jednak nie masz tego rodzaju opakowania, możesz mieć inne procedury aplikacji "kroczące" w puli połączeń, szczególnie gdy używasz serwerów z wątkami.

+0

Ten problem zdarzył się około 2 lata temu i został zamknięty z mojej strony. Dzięki za troskę. – Ecil

Powiązane problemy