为什么我的Heroku驱动的Sinatra应用程序的PostgreSQL中存在挥之不去的开放连接?

时间:2012-11-27 02:33:04

标签: ruby postgresql heroku sinatra sequel

我的网络应用程序位于www.inflationtrends.com

那里有几个计算器。第一个和第三个访问由Heroku托管的PostgreSQL数据库。应用程序本身是使用Sinatra制作的。该应用程序使用Ruby gem Sequel访问PSQL数据库。

在我的'sinatra.rb'文件中,我使用以下代码连接到PSQL数据库:

before do
  db_name = "DATABASE NAME HERE"
  user = "DATABASE USER HERE"
  password = "DATABASE PASSWORD HERE"
  host = "DATABASE HOST NAME HERE"
  port = 5432
  sslmode = 'require'
  DB = Sequel.postgres(
    db_name,
    :user=>user,
    :password=>password,
    :host=>host,
    :port=>port,
    :sslmode=>sslmode
  )
end

我还有一个'after do'块,当页面加载

时会断开与数据库的连接
after do
  DB.disconnect
end

尽管有'DB.disconnect'代码,但我注意到当多台机器使用该应用程序时仍然存在打开的连接。我注意到当运行以下代码时,当多个客户端访问应用程序时,'numbackends'(后端连接?)的数量会增加:

DB[
"SELECT *

FROM 
    pg_stat_database 

WHERE 
    datname = "DATABASE NAME HERE;"
].each{|r| p r}

我应该提一下,我在'sinatra.rb'文件中有一些如下代码:

get '/' do
    @variable = DB[
        "SQL CODE HERE"
    ]
    erb :index
end

该代码在第三个计算器中抓取“购物清单”的项目。我不知道这是否会导致连接延续。我尝试在“erb:index”行之后添加“DB.disconnect”行,但这似乎不会影响打开的连接数。

另外,在@ index.erb文件中调用@variable,但我认为“after”循环中的“DB.disconnect”语句会处理它。我甚至尝试将“DB.disconnect”添加到“index.erb”文件的末尾,但这似乎没有做任何事情。

所以,我的问题是:即使采取这些预防措施,为什么开放连接的数量会继续增加?如何修复它以便在计算完成后关闭连接?

我应该注意,我使用的Heroku提供的PSQL数据库一次最多支持20个打开的连接。

如果我需要提供更多信息/代码,请告诉我。

3 个答案:

答案 0 :(得分:3)

Database#disconnect不会断开其他线程当前正在使用的连接,因此如果在调用它时(可能在多线程应用程序中)另一个线程正在使用该连接,它将不会断开这些连接。

默认情况下,每个Sequel::Database对象最多有4个数据库连接,因此除非您运行超过5个应用程序进程,否则您应该能够保持在Heroku的20连接限制之下,而无需任何手动断开连接。

答案 1 :(得分:1)

可能是由于数据库连接没有倒退吗?我没有使用Sequel,但似乎你可能需要在你的堆栈中添加中间件 我在活动记录中有类似的问题,连接已经用尽,要克服它,我必须添加

use ActiveRecord::ConnectionAdapters::ConnectionManagement

当然对你而言续集会是另一回事。

答案 2 :(得分:1)

不要打开和关闭这样的连接。打开应用程序顶部数据库的连接(不是之前),不要关闭它。

Ruby应用程序作为一个进程运行,因此无需打开和关闭它。