在我的代码中,我在程序开始时打开DB并将db
变量传递给其他方法。我觉得这很愚蠢而且不对。但是我该怎么办?我应该在每种方法中打开数据库连接吗?但这种方式看起来也不正确......而且我有很多错误:DB::ConnectionRefused, DB::PoolTimeout, DB::PoolRetryAttemptsExceeded
所以我的代码出了问题。
def main_meth
db = DB.open("postgres://blabla@localhost:5432/bla?retry_attempts=8&retry_delay=3&max_pool_size=50&max_idle_pool_size=10&checkout_timeout=0.1") # there is always same story with or without params.
begin
db.scalar("")
...
another_meth(params, db)
channel = Channel(Nil).new(20)
groups.each do |group|
spawn one_more_meth(group, channel, db)
end
groups.size.times { channel.receive }
ensure
db.close
end
end
def another_meth(p, db)
deeper_meth(db)
end
def one_more_meth(group, channel, db)
...
db.query_all
...
channel.send(nil)
end
答案 0 :(得分:1)
我遇到了类似的问题,我发现在执行db.query时你必须确保:
将结果集保存到变量中,并在使用后关闭它们
rs = db.query("")
Class.from_rs(rs)
rs.close
或使用块
db.query("") do |rs|
Class.from_rs(rs)
end