私の Web アプリはwww.inflationtrends.comにあります。
そこにはいくつかの計算機があります。1 つ目と 3 つ目は、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
このコードは、3 番目の電卓で「食料品リスト」の項目を取得します。それが接続を長引かせるかどうかはわかりません。「erb :index」行の後に「DB.disconnect」行を追加してみましたが、開いている接続の数には影響がないようです。
また、「index.erb」ファイル内で @variable を呼び出しているのですが、「after」ループ内の「DB.disconnect」文で対応できると思いました。「index.erb」ファイルの最後に「DB.disconnect」を追加しようとさえしましたが、それは何もしないようでした。
ですから、私の質問は次のとおりです。これらの予防措置を講じても、開いている接続の数が増加し続けるのはなぜですか? 計算が完了したら接続が閉じられるように修正するにはどうすればよいですか?
最後に、私が使用している Heroku 提供の PSQL データベースは、一度に最大 20 のオープン接続をサポートしていることに注意してください。
さらに情報やコードを提供する必要がある場合は、お知らせください。