我在 ruby 方面不是很有经验(每天都用 java 编码),我正在尝试找到“Ruby 方式”来保留连接池之类的东西。我有一个带有多个线程的独立 Ruby 应用程序,我想出了类似下面的东西。
请注意,MongoClient
为 Mongo 提供的原生 ruby 驱动程序在内部维护连接池,所以我所需要的只是能够保留一个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 方式做事,而不是关于如何做一般的事情(因为我得到了它的工作)。