使用Rails 3.0和Mongo 1.4.0的连接错误

时间:2011-09-27 22:17:07

标签: ruby-on-rails ruby mongodb

我创建了一个库,可以从我的Rails应用程序向MongoDB记录事件。我使用的是mongo gem的1.4.0版和使用Ruby 1.8.7的Rails 3.0版。相关代码是:

def new_event(collection, event)
  @conn = Mongo::Connection.new("localhost", 27017, :pool_size => 5, :pool_timeout => 5)
  @conn.db("event").collection(collection).insert(event)
  @conn.close
end

这可以很好地记录网站上发生的新事件。但是,我还需要使用旧事件回填db。所以我正在运行一个基本上这样做的脚本:

SomeModel.find_each do |model|
  Tracker.new.new_event("model_event", { ... info from model ... })
end

我正在尝试按照50k事件的顺序回填。当脚本运行时,我看到了:

Tue Sep 27 23:45:20 [initandlisten] waiting for connections on port 27017
Tue Sep 27 23:46:20 [clientcursormon] mem (MB) res:12 virt:78 mapped:0
Tue Sep 27 23:48:49 [initandlisten] connection accepted from 127.0.0.1:51006 #1
Tue Sep 27 23:49:03 [conn1] remove event.application 103ms
Tue Sep 27 23:49:12 [conn1] remove event.listing 127ms
Tue Sep 27 23:49:20 [clientcursormon] mem (MB) res:37 virt:207 mapped:128
Tue Sep 27 23:51:44 [initandlisten] connection accepted from 127.0.0.1:48103 #2
Tue Sep 27 23:51:44 [conn2] end connection 127.0.0.1:48103
Tue Sep 27 23:51:44 [initandlisten] connection accepted from 127.0.0.1:48104 #3
Tue Sep 27 23:51:44 [conn3] end connection 127.0.0.1:48104
Tue Sep 27 23:51:44 [initandlisten] connection accepted from 127.0.0.1:48105 #4
Tue Sep 27 23:51:44 [conn4] end connection 127.0.0.1:48105
Tue Sep 27 23:51:44 [initandlisten] connection accepted from 127.0.0.1:48106 #5
Tue Sep 27 23:51:44 [conn5] end connection 127.0.0.1:48106

端口(127.0.0.1:XXXXX)和(我假设的)连接池#s不断递增,直到最终我从ruby脚本中获得此异常:

Failed to connect to a master node at localhost:27017
/var/bundler/turtle/ruby/1.8/gems/mongo-1.4.0/lib/../lib/mongo/connection.rb:526:in `connect'
/var/bundler/turtle/ruby/1.8/gems/mongo-1.4.0/lib/../lib/mongo/connection.rb:688:in `setup'
/var/bundler/turtle/ruby/1.8/gems/mongo-1.4.0/lib/../lib/mongo/connection.rb:104:in `initialize'

1 个答案:

答案 0 :(得分:0)

刚刚找到解决方案。我需要使连接对象成为一个类变量,因此它在Tracker类的所有实例中共享。

@@conn = Mongo::Connection.new("localhost", 27017, :pool_size => 5, :pool_timeout => 5)
def self.new_event(collection, event)
  @@conn.db("event").collection(collection).insert(event)
end