ruby sequel和postgreSQL - 太多客户端(连接)

时间:2015-05-10 21:37:59

标签: ruby postgresql sequel grape-api

我正在使用我的应用程序(机架应用程序)中使用的数据库类中的续集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正在尝试在池中创建一个新连接,但是,应用程序并不是特别健谈。

1 个答案:

答案 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