В моем коде я открываю БД при запуске программы и передаю переменную 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
db.query
вы должны либо использовать блок:db.query("") do |rs|; end
, либо закрыть набор результатов:rs = db.query("");rs.close
- person fridgerator   schedule 18.03.2017Class.from_rs(db.query "")
может не закрыть результирующий набор. Вы можете попробовать сохранить запрос в переменную и послеfrom_rs
закрыть его:rs = db.query("");Class.from_rs(rs);rs.close
- person fridgerator   schedule 20.03.2017