2012-04-29 3 views
0

私は、DatamapperとActiveRecordを使用して、スフィンクス2 &リアルタイムインデックスを処理するための一連の宝石、スタンドアロンに取り組んでいます。これを行うには、(明らかに)スフィンクスとの接続を開きます。ネットワークサービスへの接続を開いている宝石の接続プーリング

https://github.com/d11wtq/oedipus

Oedipus.connection("sphinxql.host.tld:9306") 

今私は、接続の管理について空想何もしていないよ...宝石のユーザが接続を行う場合、新しい接続が開かれ、それはそれです。その接続を管理するのはユーザーの責任です。しかし、他の宝石はプールのコンセプトを持っているようですが、私は実際にはシングルスレッドの環境では決して得られません。

誰かがについて啓発してください。なぜプールが必要なのか、私のK.I.S.S.の影響私はプールを追加する方法は?スレッドごとに1つの接続が有効に存在するマルチスレッドアプリケーションでは、プーリングは本当に意味をなさないでしょうか?それとも他の有効なユースケースがありますか?それがマルチスレッドアプリケーションのためだけのものであれば、ユーザーはおそらく宝石製作の前提条件よりも管理しやすいだろうか?私は、ねじ実装に推測している

、シンプルな「無制限の接続」のアプローチは、次のようになります。

def connection 
    Thread.current[:oedipus_connection] ||= connect(args) 
end 

スレッドが消えたときに、その接続がありません(リソースが解放されたときにクリーンアップが起こります) 。

それは私の心の中で遊んでいて、私は組み込みのプール/管理を持たないと私を迎えに戻ってくるだろうと思っています。

答えて

1

一般に、マルチスレッドアプリケーションでは複数の接続が必要です。理論的にはシングルスレッドのアプリケーションで複数の接続を使用することは可能ですが、それには十分な理由はないでしょう。

接続プールの主な利点は、新しいデータベース接続の設定のオーバーヘッドを最小限に抑えるために、データベース接続を再利用できるように維持することです。これは、各リクエストがたった1つまたはいくつかのデータベースクエリをもたらすかもしれないレールのような典型的な接続ごとのリクエストシナリオでは重要です。次に、接続設定が要求時間のかなりの部分になります。

しかし、適切な接続プーリングシステムを設定するにはちょっとしたPITAです。あなたは、接続タイムアウトとクリーンアップを心配する必要があります。例としてActiveRecord connection pooling codeを確認してください。

正しい接続を使用して接続プーリングを心配する必要はありません。それは

class MyConnection 
    def self.get1(args) 
     # establish a connection and return it 
    end 

    def close 
     # close the connection 
    end 
end 

それとも

def use_connection 
    connection = nil 
    begin 
    connection = open_a_connection 
    yield connection 
    ensure 
    connection and connection.close 
    end 
end 

ようなものになるだろう。そして、あなたはアプリの残りの部分を触れることなく、後でインターフェースは、より洗練されたことができます。

+0

私は実際に接続タイムアウトについては考えていませんでした。これはそれを追加する理由かもしれません。ユーザーが接続を長時間開いていると、サーバーは接続を終了する可能性があります。おそらく接続が切れている必要があり、過去60秒など古い場合は新しい接続が返されます。ありがとう。本当に2つの心で。たぶん、暗黙のうちにオプトインでオプティマイザを選択するだけです。 – d11wtq

+0

私は何かを実装しました、私は大丈夫だと思います。 https:// github。com/d11wtq/oedipus/blob/master/lib/oedipus/connection/pool.rb長い時間8スレッドを同時にスラミングしましたが、プールのサイズは大きくなりませんでした。最大80スレッドまで同時にスケーリング(自分の正気のため)とビンゴ、魔法のプーリングを起こす。助けてくれてありがとう :) – d11wtq

関連する問題