2011-11-01 28 views
4

私はSinatraで小さなチャットアプリケーションを作成し、herokuではjQueryを作成しました。ユーザーがメッセージを送信すると、データベースにメッセージが挿入されます。また、2秒ごとに新しいメッセージをダウンロードします。テストの数分後には動作を停止し、私は、電子メールフォームHerokuの受信:データベース接続プール

こんにちは、

我々はgisekchatアプリが共有データベースへのオープン接続 を大量に持っていたことに気づいたの。パフォーマンス上の理由から、 の接続数を共有データベースに制限する必要がありました。 共有データベースへの全体接続数を減らすか、または 専用データベースに移動できますか?

接続プール を利用していないと思われ、 からのリクエストごとにデータベースへの新しい接続が開かれています。

post '/send' do 
    con = con = PGconn.connect($dbhost, 5432, "","",$dbname, $dbuser, $dbpass) 
    con.exec("insert into messages(usr, msg, date) values('#{params[:usr]}','#{params[:msg]}', now())")  
end 

にはどうすれば接続プーリングを有効にするために、それを変更する必要があります。

おかげで、 -Chris

これはアクションが(受信は非常に似ている)メッセージを送信し支援していますか?

答えて

6

ええ、それは本当に、あなたは実際には、データベースへの新しい接続を開いているときに、 'send'-post sendがあります。

これを変更する必要があります。一つの可能​​性は、グローバル接続を開くために、ことがあります

$con = PGconn.connect($dbhost, 5432, "","",$dbname, $dbuser, $dbpass) 

あなたは$ dbnameは...変数を初期化した後、これが行われる必要がありますが、あなたはどのルートを使用する前に。

しかし、あなたの代わりに、古典的な一つで、モジュラーシナトラのバージョンを使用している場合、あなたは

attr_accessor :con 

でインスタンス変数を宣言する可能性があり、アプリが起動される前に、それを初期化します。

4

Robustusが途中にある インスタンス変数を作成すると、クラスのインスタンスごとに接続が作成されます。

あなたが望むのは、接続オブジェクトへのアクセスを処理するためにミューテックスを使用するスレッドセーフなデータストアAPIです。これは、ActiveRecordがレールで使用する制御メカニズムです。

これを行うための簡単なメカニズムを提供する「q」というルビーの宝石を作成しました。 宝石は次の場所にあります。

class DataConnection < ResourcePool 
    def create_resource 
    PGConn.connect(@config) 
    end 
end 
@datasource = ResourcePool.new(your_connection_info_here) 
:初期化中にデータストアを作成し、その後、 require 'q/resourcepool'

https://github.com/jacobsimeon/q

は、あなたのアプリケーションを初期化するものは何でもファイルに以下を追加し、この git clone https://github.com/jacobsimeon/q

のようにインストールします

@datasourceを使ってyoに対してコマンドを実行することができますあなたはこのルートを行くことに興味があれば、ウルデータベース

post '/send' do 
    @datasource.exec(standard_postgres_params) 
end 

はgithubのか、ツイッター(両方で@jacobsimeon)で私に連絡してください。

+0

スレッド安全性が達成する必要がある場合はそうだと思われますが、これは普通はモダラ版ではなく、古典的なもの(afaik) – robustus

+0

から見ることができます、それは私たちがsinatraアプリを扱っているように見えます。私は確信していませんが、すべてのリクエストは英雄の無料ホスティングの新しいスレッドを介して来ると思います。 「モジュール版」とはどういう意味ですか? – jacobsimeon

+0

sinatraアプリを書くには2つの異なるバージョンがあります。古典的なもので、「メイン」ファイルにはルートと操作が含まれています。インスタンス変数がなく、Sinatra :: Baseからクラスを実装するモジュール式のもの – robustus

1

私は 'classic'のsinatraアプリケーションを使用しましたが、クラス変数を宣言することで同じ結果が得られました。例えば@@ db_connection。これは常に同じ接続を使用し、私のために働く。