2

私の 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 のオープン接続をサポートしていることに注意してください。

さらに情報やコードを提供する必要がある場合は、お知らせください。

4

3 に答える 3

3

Database#disconnect他のスレッドが現在使用している接続を切断しないため、呼び出し時に別のスレッドがその接続を使用している場合 (マルチスレッド アプリで可能性が高い)、それらの接続は切断されません。

デフォルトでは、オブジェクトごとに最大 4 つのデータベース接続があるSequel::Databaseため、5 つを超えるアプリ プロセスを実行していない限り、手動で切断することなく、Heroku の 20 接続制限内にとどまることができるはずです。

于 2012-11-27T17:31:23.077 に答える
1

そのように接続を開いたり閉じたりしないでください。アプリの上部にあるデータベースへの接続を(以前ではなく)開き、閉じないでください。

Rubyアプリは1つのプロセスとして実行されるため、アプリを開いたり閉じたりする必要はありません。

于 2012-11-27T10:44:21.300 に答える
1

DB接続がフォールバックしないことが原因でしょうか? Sequel を使用したことはありませんが、スタックにミドルウェアを追加する必要があるようです

use ActiveRecord::ConnectionAdapters::ConnectionManagement

もちろん、あなたにとっては、Sequel にとっては別のものになるでしょう。

于 2012-11-27T05:03:28.247 に答える