【发布时间】:2025-12-17 12:45:02
【问题描述】:
我在 ruby 方面不是很有经验(每天都用 java 编码),我正在尝试找到“Ruby 方式”来保留连接池之类的东西。我有一个带有多个线程的独立 Ruby 应用程序,我想出了类似下面的东西。
请注意,Mongo 原生 ruby 驱动程序提供的 MongoClient 在内部维护连接池,所以我只需要能够保留一个 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
我知道这行得通(检查了@mongo 的object_id 是否在多次调用中保持不变),但这是保留事情的首选方式吗?
可能有多个存储库,因此每个存储库都可以包含MongoPool 并使用其连接。上述解决方案有什么缺点吗?还有其他我应该注意的方法吗?
注意:问题更多是关于如何以 Ruby 的方式做事,而不是关于如何做一般的事情(因为我得到了它的工作)。
【问题讨论】:
-
这不是游泳池。这是一个单例连接。完全不同的野兽。
-
对,我错过了池配置。问题已编辑和修复