簡體   English   中英

如何使用Ruby on Rails創建新的ActiveRecord連接池?

[英]How to create a new ActiveRecord Connection Pool with Ruby on Rails?

我有一個RoR應用程序,適用於主要的RoR數據庫。 我還想以一種方式連接到任意數據庫,這樣我就不會為每個新的HTTP請求重新創建數據庫連接。 根據我的研究,它看起來像連接池是要走的路。

但是,我無法弄清楚如何創建池本身:

config = ActiveRecord::ConnectionAdapters::ConnectionSpecification.new( {
          "adapter"  => "postgresql",
          "host"     => "localhost",
          "port"     => 9000,
          "database" => "foo_test",
          "username" => "foo",
          "password" => "bar",
          "pool"     => "5",
          "timeout"  => "3000"
        })

my_connection_pool = ActiveRecord::ConnectionAdapters::ConnectionPool.new(config)

NameError的錯誤:未初始化的常量ActiveRecord :: ConnectionAdapters :: ConnectionSpecification。 Interstingly ActiveRecord :: ConnectionAdapters :: ConnectionPool工作正常(但沒有正確的配置對象)。

我該怎么辦?

而且,這些是用來解決我的問題的正確方法嗎?

根據您的使用情況,Rails可能會自動為您執行此操作。 每個ActiveRecord::Base子類都會查找繼承鏈以查找其池,因此

class Foo < ActiveRecord::Base
end

使用ActiveRecord::Base連接池,但是

class Bar < ActiveRecord::Base
  establish_connection database: 'some_other_db'
end

class BarSub < Bar
end

將使用Bar池連接到'some_other_db'。

我不記得確切,但我想每次使用ActiveRecord::Base.establish_connection (或任何子類的establish_connection )時,它都會創建一個新池。 否則將是荒謬的!

關於establish_connection的一個可能有用的SO帖子

我只是在我的初始化程序中有一個單獨的文件,用於創建多個連接。 lib文件是:

require 'active_record'

module whateverName

  def self.included(klass)
    klass.extend(ClassMethods)
  end

  module ClassMethods
    def base(dbName)
      establish_connection(ActiveRecord::Base.configurations[dbName.to_s][Rails.env])
    end
  end

end

將該文件保存在lib中,並在模型中包含此文件並傳遞數據庫類型。 確保database.yml具有所需的配置。 模型將是這樣的:

class Bar < ActiveRecord::Base
  include whateverName
  base :oracle
end

您需要擁有的只是database.yml中的oracle配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM