3

私はruby(日常的にJavaでコーディングする)の経験があまりなく、接続プールなどを維持するための「Rubyの方法」を見つけようとしています。複数のスレッドを持つスタンドアロンのRubyアプリを作成しましたが、次のようなものを思いつきました。

MongoMongoClientのネイティブrubyドライバーによって提供されるものは、内部で接続プールを維持するため、必要なのは、1つのインスタンスを維持できるようにすることだけですMongoClient

require 'mongo'

module MongoPool

  # module instance var to ensures only one exists
  @mongo = nil

  def self.lazy_create
    @mongo ||= Mongo::MongoClient.new('localhost', 27017, :pool_size => 5, :timeout => 5)
  end

  # when getting connection lazily create pool by assigning to @mongo only if nil
  def connection
    MongoPool.lazy_create
  end

end

class PeopleRepository

  include MongoPool

  def random_person
    coll = connection['test']['people']
    coll.find_one
  end

end

# usage
PeopleRepository.new.find_one

私はそれが機能することを知っています(いくつかの呼び出しで同じままであることobject_idを確認しました)が、これは物事を維持するための好ましい方法ですか?@mongo

複数のリポジトリが存在する可能性があるため、それぞれがMongoPoolその接続を含めて使用できます。上記のソリューションの欠点はありますか?他に知っておくべき方法はありますか?

注:問題は、Rubyの方法で物事を行う方法に関するものであり、一般的な方法ではありません(私がそれを機能させたとき)。

4

2 に答える 2

5

これを行うために別の gem は実際には必要ありません。実際、Mongoid のドライバー (Moped) は接続プールをまだサポートしていません。

Rails でアプリケーション レベルの定数を使用するという推奨事項と同様に、ヘッドレス アプリケーションでクラス変数を使用するだけで、アプリケーションの基本クラスのすべての呼び出しで MongoClient インスタンスが同じ単一のオブジェクト/プール インスタンスになります。

たとえば、次のようなことができます。

require 'mongo'

class MyApplication
  include Mongo

  # creates a single class instance, sets pool size but won't connect until used (lazy)
  @@client = MongoClient.new('localhost', 27017, :pool_size => 5, :connect => false)

  def do_something
    @@client['my_db']['my_collection].insert({ "foo" => "bar"})
  end
end

シンプルでとてもわかりやすい。上記で使用したモジュール アプローチは必要ありません。

あなたは Torquebox について言及したので、JRuby を使用していて、Torquebox にアプリケーションのスレッド プールを管理させていると思います。

バージョン 1.8.3 以降の mongo ruby​​ ドライバーを実行していることを確認してください。これには、その種のスレッドを多用するセットアップで実行するためのいくつかの主要な修正と改善が含まれています。いくつかのスレッド セーフの問題に対処し、接続プールの同時実行性を大幅に改善しました。

それが役立つことを願っています。

于 2013-03-07T23:41:56.260 に答える
2

あなたがレールを使用していると仮定すると、私はこれを行います:

# config/initializers/mongo.rb
MONGODB = Mongo::MongoClient.new('localhost', 27017, :pool_size => 5, :timeout => 5)

mongomapper などのライブラリを使用している場合、プーリングを構成して透過的に使用する方法がおそらくあります。

ここでmongoライブラリを見てください:http://railscasts.com/episodes/194-mongodb-and-mongomapper

于 2013-03-04T10:04:38.077 に答える