2016-04-28 21 views
0

私たちはC++アプリケーションのデータを格納するPostgreSQLデータベースを持っており、libpqxxを使って接続しています。PostgreSQLデータベース接続を開く効率

現在、実行するトランザクションごとに新しいpqxx::connectionを開きます。デプロイメントでは、毎分約4〜5ダースのトランザクションを実行することが予想され、アプリケーションは24x7x365で実行されます。 PostgreSQLのarchitectural fundamentals

... [PostgreSQLサーバプロセスが( "フォーク")を開始し、各接続のための新たな方法によれば

。私たちは、間接的に数十人の新しいプロセス毎分産卵しているため、すべてのトランザクションのための新しいpqxx::connectionを開く我々の方法のように私に聞こえる

は、本当に非効率的です。これは私たちが本当に心配しなければならないものですか?

here on the PostgreSQL wiki私はPostgreSQL自体がクライアント接続プロセスのプールを維持していないので、実際にはそれについて心配する必要があるようです。もしそうなら、pqxx::connectionのオブジェクトを無期限に保つ「適切な」方法があります。そうすれば、データベースに接続するたびに新しいプロセスがフォークされないようにすることができますか?私のアプリケーションは毎日、毎日実行する必要があることを覚えておいてください。そうすれば、TCP接続が長期間に渡ってドロップすることは受け入れられません。

答えて

1

あなたがやっていることは非効率的ですが、それほど劇的ではありません。 PostgreSQLのフォークコストは、Unixプラットフォームでは低いです。バックエンドは作成して破壊するのにかなり安いです。

セットアップ、認証などに時間がかかるので、トランザクションの待ち時間が長くなります。

接続プールは、アプリ内またはpgbouncerのようなプロキシで使用することをお勧めします。それは、「1分あたり数十ダースの接続数」のため、負荷の問題に直面していない限り、あまり心配しないと言いました。醜いですが、それほど悪くはありません。

TCP接続は、一定の期間が経過しても「ドロップ」しません。リソースが限られているステートフルなNATルータやファイアウォールの背後にいる場合を除いて、無期限にアイドル状態を維持できます。 TCPキープアライブを有効にするだけでよい場合あなたが好きな限り、接続を開いたままにしておかないと本当の理由はありません。いずれの場合においても

バックエンドは決して、これまで等により管理アクション、PostgreSQLサーバのクラッシュリカバリと再起動、バグ、OOMの原因となるサーバリソースの枯渇に死ぬことができるので、あなたのアプリケーションが既に接続損失ためのロジックを再試行している必要がありますが火を消し、取引を忘れる。あなたのアプリは、最初からxact全体をやり直すために必要な完全な状態を覚えておいて、xactがDBからコミットしたという確認を受け取るまで待つべきです。いずれかのステップで障害が発生した場合は、再接続して再試行する必要があります。

+0

ご回答ありがとうございます。私は入力を感謝します。この非効率性を私たちのコードで文書化して、将来の拡張のための場所として確かめるでしょう:) – villapx

関連する問題