4

マルチホームのRailsアプリがあります。

foo.mysite.com「foo」データベースと通信します。

bar.mysite.com「バー」データベースと話します。

これは、次の呼び出しによって実現されます。

ActiveRecord::Base.connection_handler.establish_connection("ActiveRecord::Base", foo_spec)

リクエストが foo に来るときは foo_spec を使用し、リクエストが bar に来るときは bar_spec を使用します。

すべてが幸せで、世界は平和です。

でも、

私も使用しますsidekiq。マルチスレッド化が進んでいます。

sidekiq で奇妙な動作が発生していました。foo_db と話していると思ったら、しばしば bar_dbActiveRecord::Base.connectionを指していました。

コードを掘り下げたところ、次のことがわかりました。

 def retrieve_connection_pool(klass)
    pool = @class_to_pool[klass.name]
    return pool if pool
    return nil if ActiveRecord::Base == klass
    retrieve_connection_pool klass.superclass
  end

AR の内部設計では、AR::Base は単一の接続プールについてしか認識できないことがわかりました。

を使用して、スレッド 1 が db1 と通信し、スレッド 2 が同時に db2 と通信する方法はありますActiveRecord::Base.connectionか?

4

1 に答える 1

-1

データベースを完全に分離するのではなく、Postgres と個別のスキーマを使用することをお勧めします。つまり、プールを共有できます。

使い方は次のようになります: select * from foo.users,select * from bar.users

そして、スキーマを引数としてバックグラウンド ワーカーに渡します。

于 2014-10-23T20:53:03.850 に答える