私は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の方法で物事を行う方法に関するものであり、一般的な方法ではありません(私がそれを機能させたとき)。