这是在Ruby中保持连接池的首选方法吗?
我对
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方式执行操作,而不是关于如何一般地执行此操作(因为我使用它). 解决方法
你真的不需要另一个宝石来实现这一点,实际上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',:connect => false) def do_something @@client['my_db']['my_collection].insert({ "foo" => "bar"}) end end 简单而且非常直截了当.您没有必要使用上面使用的模块方法. 你提到了Torquebox所以我假设你正在使用JRuby并让Torquebox为你管理你的应用程序的线程池. 确保你运行的是mongo ruby??驱动程序的1.8.3或更高版本,其中包括一些主要的修复和改进,以便在这种类型的线程设置下运行.我们解决了一些线程安全问题,并大大提高了连接池的并发性. 希望有所帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 今天发现listings包的跨页问题(2014-3-26)
- c# – 如何从Visual Studio 2017预览版2指定Azure功能的输出
- 如何对json代码进行格式化显示
- 依赖注入 – 域驱动设计和IoC /依赖注入
- 修改CSDN Blog的“聚合 | xml”链接为自己烧的feed
- ruby-on-rails – 这段代码如何抛出ActiveRecord :: ReadOn
- C 语言中strstr函数实例详解
- 机房收费系统之选中MSHFlexGrid中的某条记录进行删除
- c# – 当我用linq键入时运行任务(如果仍在运行则取消上一个
- 基于xml配置的Spring AOP切面的几点总结,以及简单的例子