我在使用以下脚本时遇到了一些问题:
require 'rubygems'
require 'active_record'
require 'net/ssh/gateway'
gateway = Net::SSH::Gateway.new('myserver.com', 'myuser', :password => "mypass")
puts "true" if gateway.active?
p = gateway.open('127.0.0.1', 3306, 3307)
class MyClass < ActiveRecord::Base
establish_connection(
:adapter => "mysql",
:host => "127.0.0.1",
:username => "db_user",
:password => "db_pass",
:database => "mydb_production",
:port => 3307
)
end
puts MyClass.all.size
gateway.shutdown!
当我运行脚本时它会挂起,除非我删除了activerecord查询。我知道我可以使用隧道连接,因为我可以从命令创建隧道,如下所示:
ssh -f myuser@myserver.com -L 3307/127.0.0.1/3306 -N
然后如果我跑:
require 'rubygems'
require 'active_record'
class MyClass < ActiveRecord::Base
establish_connection(
:adapter => "mysql",
:host => "127.0.0.1",
:username => "db_user",
:password => "db_pass",
:database => "mydb_production",
:port => 3307
)
end
puts MyClass.all.size
工作正常。我做错了什么?
感谢。
答案 0 :(得分:9)
通过使用mysql2 gem
,我能够在没有fork的情况下使用它require 'rubygems'
require 'active_record'
require 'mysql2'
require 'net/ssh/gateway'
gateway = Net::SSH::Gateway.new(
'remotehost.com',
'username'
)
port = gateway.open('127.0.0.1', 3306, 3307)
class Company < ActiveRecord::Base
establish_connection(
:adapter => "mysql2",
:host => "127.0.0.1",
:username => "dbuser",
:password => "dbpass",
:database => "dbname",
:port => 3307
)
end
puts Company.all.size
答案 1 :(得分:2)
我认为评论是对的 - 数据库与ssh代码中的事件循环冲突。
试试这个:
require 'rubygems'
require 'active_record'
require 'net/ssh/gateway'
gateway = Net::SSH::Gateway.new('myserver.com', 'myuser', :password => "mypass")
puts "true" if gateway.active?
port = gateway.open('127.0.0.1', 3306, 3307)
fork.do
class MyClass < ActiveRecord::Base
establish_connection(
:adapter => "mysql",
:host => "127.0.0.1",
:username => "db_user",
:password => "db_pass",
:database => "mydb_production",
:port => 3307
)
end
puts MyClass.all.size
end
Process.wait
gateway.shutdown!