【问题标题】:ActiveRecord::ConnectionNotEstablished error (eager loading?)ActiveRecord::ConnectionNotEstablished 错误(急于加载?)
【发布时间】:2011-12-07 00:45:18
【问题描述】:

我正在 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
  }
}

似乎一阶关联的急切加载在测试环境中不起作用,在第一个示例中。即使我使用“包含”它也不起作用。

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

【问题讨论】:

  • 为了确保它不是你的版本,交换你的数据库连接并让你的 DEV 版本与你的 TEST 数据库对话。您需要重新配置(并确保端口已打开!),但至少您知道这是否会导致它。您也可以反之亦然(让您的 TEST 连接到您的 DEV)。
  • 您在设置中说“开发”和“测试”,您真的是指开发和生产吗?您列出的两个环境具有不同版本的 AR。在我看来,这不太可能是 linux 与 OSX 的问题,更有可能是您在两个环境中使用了不同版本的 ActiveRecord,并且在其中一个环境中遇到了错误或奇怪的边缘情况。第一步是在两者中使用相同版本的 ActiveRecord(这应该不难做到,你不是在它们之间使用相同的 Gemfile.lock 吗?你应该是)。一旦你确定了,再回来。
  • @jrochkind 这真的是开发和测试。但你指出了我没有注意到的东西:AR、Ruby 和 PostgreSQL 有不同的版本。我会检查并尝试修复版本。谢谢你指点我。
  • 我认为 AR 的不同版本很可能比 ruby​​ 或 postgres 的不同版本更重要。由于标准化 AR 版本也比更改您的 ruby​​ 或 postgres 安装更容易,所以我将从这个开始。
  • 您似乎没有使用 Rails -- 您确定 ActiveRecord::Base.establish_connection 会在测试环境中被调用吗?

标签: ruby activerecord eager-loading ubuntu-11.04


【解决方案1】:

您在什么上下文中使用此代码?

原因是 - 如果您在响应循环中运行代码(例如在服务器中),当前 ActiveRecord 需要一些连接池管理。 Rails 使用中间件来解决这个问题,该中间件在主应用程序响应者之外为您管理 AR 连接。但是,如果您没有这种包装器,则可能会有其他应用程序例程“踩踏”您的连接池,尤其是在使用线程服务器时。

【讨论】:

  • 这个问题发生在大约 2 年前,我已经解决了。感谢您的关心。
猜你喜欢
  • 2011-08-27
  • 2012-04-05
  • 2014-09-11
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多