我的网络应用程序位于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个打开的连接。
如果我需要提供更多信息/代码,请告诉我。
答案 0 :(得分:3)
Database#disconnect
不会断开其他线程当前正在使用的连接,因此如果在调用它时(可能在多线程应用程序中)另一个线程正在使用该连接,它将不会断开这些连接。
默认情况下,每个Sequel::Database
对象最多有4个数据库连接,因此除非您运行超过5个应用程序进程,否则您应该能够保持在Heroku的20连接限制之下,而无需任何手动断开连接。
答案 1 :(得分:1)
可能是由于数据库连接没有倒退吗?我没有使用Sequel,但似乎你可能需要在你的堆栈中添加中间件 我在活动记录中有类似的问题,连接已经用尽,要克服它,我必须添加
use ActiveRecord::ConnectionAdapters::ConnectionManagement
当然对你而言续集会是另一回事。
答案 2 :(得分:1)
不要打开和关闭这样的连接。打开应用程序顶部数据库的连接(不是之前),不要关闭它。
Ruby应用程序作为一个进程运行,因此无需打开和关闭它。