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 最佳实践 [关闭]