我在使用Ruby DRb时遇到了一个非常奇怪的行为,或者问题可能是dbm。我使用dbm数据库与服务器,以及通过DRb发出请求的客户端。
这是问题的方法(数据库连接正常),它在服务器中:
def get id
obj = nil
db = DBM.open @name
obj = db[id.to_s]
db.close
return obj
end
这行obj = db[id.to_s]
在客户端返回错误connection closed (DRb::DRbConnError)
。
问题是,如果我这样做obj = db['1']
它工作正常('1'是dbm中的一个关键)。为什么会这样? id
有什么问题?这是客户端的电话:
DRb.start_service
r = DRbObject.new_with_uri(SERVER_URI)
puts r.get '1'
为什么我收到此错误?这种方法也会发生同样的事情:
def delete id
db = DBM.open @name
db.delete id
db.close
end
尝试修补你的ruby,给你一些关于服务器端关系错误的更多细节。
见:https://github.com/ruby/ruby/pull/1260。
在我的情况下,这是一个声明safe_level
的问题,然后我调用的一些代码最终违反了安全性(即进行“危险调用”)。
在/lib/drb/drb.rb,当sz.nil?
和str.nil
看起来连接闭合错误。
raise(DRbConnError, 'connection closed') if sz.nil?
raise(DRbConnError, 'connection closed') if str.nil?
obj = db[id.to_s]
回归了什么?