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

Posted

技术标签:

【中文标题】ruby sequel 和 postgreSQL - 客户端太多(连接)【英文标题】:ruby sequel and postgreSQL - too many clients (connections) 【发布时间】:2015-05-10 21:37:58 【问题描述】:

我在跨我的应用程序(机架应用程序)使用的数据库类中使用了 sequel gem,它只实例化一次。

DB类初始化sequel一次,有一些我调用的方法,主要是只读的:

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 个“选择”。但是,每个新请求都会失败并出现以下错误:

Sequel::DatabaseConnectionError: PG::ConnectionBad: FATAL: 抱歉,已经有太多客户了

/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】:

您应该只创建一次连接池,并为每个请求从池中签出一个连接,但在您的代码中,您只需为每个请求创建一个新池。

您可以像这样更改您的数据库类:

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

【讨论】:

谢谢 - 成功了。也许是一个愚蠢的问题,但我试图理解为什么如果我只创建一次数据库,@psql 会初始化多次?我什至在里面放了一个 ||=... 在您的原始代码中,您在构造函数中调用Sequel.connect。新实例在调用@psql ||= Sequel.connect(...) 之前最初没有@psql,因此即使您使用||=,它也相当于使用=,只是性能损失很小。在我的代码中,@psql 属于 DB 类,而不是它的实例。由于类只加载一次,@psql 只初始化一次。 P.S.由于@psql 现在属于DB 类,DB 的实例无法直接访问它。这就是我提供类级别属性访问器的原因。

以上是关于ruby sequel 和 postgreSQL - 客户端太多(连接)的主要内容,如果未能解决你的问题,请参考以下文章

sequelize(和 sequelize-cli)queryInterface.createTable 在 PostgreSQL 上,PK id 类型为 UUID 和 defaultValue:Se

如何使用 Sequelize + PostgreSQL 将项目附加到数组值

使用 Sequelize.js 和 PostgreSQL 在关联模型上查询 JSONB 字段

使用 PostgreSQL 进行一对多设计的 Sequelize.js 最佳实践 [关闭]

Sequelize:在 PostgreSQL 的 JSON 数据类型上使用 $like

如何在 Sequelize 中创建一个表以使用 Node JS 存储在 Postgresql 中