使用DB和DB连接池的正确方法是什么?

时间:2017-03-16 17:49:36

标签: crystal-lang

在我的代码中,我在程序开始时打开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

1 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,我发现在执行db.query时你必须确保:

将结果集保存到变量中,并在使用后关闭它们

rs = db.query("")
Class.from_rs(rs)
rs.close

或使用块

db.query("") do |rs|
    Class.from_rs(rs)
end