我正在使用我的应用程序(机架应用程序)中使用的数据库类中的续集gem,它只实例化了一次。
DB类初始化续集一次并且有一些我调用的方法,主要是只读:
def initialize
@psql ||= Sequel.connect('postgres://localhost/mydb')
end
def query_example
@psql[:users].order(:time)
end
该应用程序基本上是一个API。类似的东西:
class API < Grape::API
format :json
before do
@db = Db.new
end
get '/' do
@db.query_example
end
这一直有效,直到我在postgreSQL中达到100个连接。我假设续集正在使用某种连接池但不知何故没有释放连接?我可以在pg_stat_activity表中看到100'选择',状态为'idle'。但是,每个新请求都会失败,并显示以下错误:
Sequel :: DatabaseConnectionError:PG :: ConnectionBad:致命:抱歉,已有太多客户
/Users/lopezj2/.rvm/gems/ruby-2.1.2/gems/sequel-4.22.0/lib/sequel/adapters/postgres.rb:236:in `initialize'
/Users/lopezj2/.rvm/gems/ruby-2.1.2/gems/sequel-4.22.0/lib/sequel/adapters/postgres.rb:236:in `new'
/Users/lopezj2/.rvm/gems/ruby-2.1.2/gems/sequel-4.22.0/lib/sequel/adapters/postgres.rb:236:in `connect'
/Users/lopezj2/.rvm/gems/ruby-2.1.2/gems/sequel-4.22.0/lib/sequel/connection_pool.rb:101:in `make_new'
看起来Sequel正在尝试在池中创建一个新连接,但是,应用程序并不是特别健谈。
答案 0 :(得分:2)
您应该只创建一次连接池,并为每个请求检查池中的连接,但是在您的代码中,您只需为每个请求创建一个新池。
您可以像这样更改您的数据库类:
class DB
class << self
attr_reader :psql
end
# Note that @psql is a class instance variable
@psql = Sequel.connect('postgres://localhost/mydb')
def query_example
DB.psql[:users].order(:time)
end
end