2

我的网络应用程序位于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
  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 个打开的连接。

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

4

3 回答 3

3

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

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

于 2012-11-27T17:31:23.077 回答
1

可能是由于数据库连接没有回退吗?我没有与 Sequel 合作过,但似乎您可能必须将中间件添加到您的堆栈中

use ActiveRecord::ConnectionAdapters::ConnectionManagement

当然,对你来说,续集会是另外一回事。

于 2012-11-27T05:03:28.247 回答
1

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

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

于 2012-11-27T10:44:21.300 回答