1 つのリクエストで複数のデータベース接続を行うことが悪い習慣なのはなぜですか?

StackOverflow https://stackoverflow.com/questions/28590

質問

シングルトンについてのディスカッション PHP この問題についてますます考えさせられます。ほとんどの人は、1 つのリクエストで大量の DB 接続を作成すべきではないと指示していますが、私はあなたの理由が何なのか知りたいです。最初に考えたのは、DB に多くのリクエストを行うことによるスクリプトへの負担ですが、その後、次のような質問で自分自身に反論します。複数の接続を使用すると、同時クエリの効率が向上するのではないでしょうか?

詳しい人たちから(証拠付きで)答えてもらったらどうですか?

役に立ちましたか?

解決

データベース接続は限られたリソースです。一部の DB では接続制限が非常に低いため、接続の無駄が大きな問題となります。多くの接続を消費すると、他のユーザーによるデータベースの使用がブロックされる可能性があります。

さらに、DB サーバー上にアイドル状態のリソースがない限り、DB に大量の追加の接続をスローしても何の役にも立ちません。8 つのコアがあり、クエリを満たすために 1 つのコアだけが使用されている場合は、確かに、別の接続を作成すると解決する可能性があります。ただし、利用可能なコアをすべてすでに使用している可能性が高くなります。また、すべての DB リクエストで同じハードドライブにアクセスし、追加のロック競合が発生する可能性があります。

DB の使用率が高いような場合は、接続を追加しても役に立ちません。これは、追加の同時実行によって処理が高速化されることを盲目的に期待して、アプリケーション内に追加のスレッドを生成するようなものです。それ かもしれない 特定の状況では動作しますが、他の場合では、ハード ドライブに負荷がかかり、タスクの切り替えに時間を浪費し、同期のオーバーヘッドが発生するため、速度が低下するだけです。

他のヒント

これは、接続のセットアップ、データの転送、その後の切断にかかるコストです。それはパフォーマンスを消耗してしまいます。

証拠を見つけるのは難しいですが、次のことを考慮してください...

接続を確立するのに x マイクロ秒かかるとします。

ここで、いくつかのリクエストを作成し、データをやり取りしたいとします。1 つの接続と多数の接続の間での転送時間の差は無視できるとします (議論のために)。

ここで、接続を閉じるのに y マイクロ秒かかったとします。

1 つの接続を開くには、x+y マイクロ秒のオーバーヘッドがかかります。多数を開くには n * (x+y) がかかります。それはあなたの死刑執行を遅らせることになります。

DB 接続のセットアップは通常、非常に負荷がかかります。舞台裏ではいろいろなことが起こっている (DNS解決/TCP接続/ハンドシェイク/認証/実際のクエリ).

一度、奇妙な DNS 設定で問題が発生し、すべての TCP 接続が確立されるまでに数秒かかるという問題が発生しました。私のログイン手順 (アーキテクチャが複雑なため) を完了するには 3 つの異なる DB 接続が必要でした。この問題により、ログインに時間がかかっていました。次に、コードをリファクタリングして、1 つの接続のみを通過するようにしました。

.NET から Informix にアクセスし、複数の接続を使用します。接続ごとにトランザクションを開始しない限り、多くの場合、トランザクションは接続プールで処理されます。これは非常にブランド固有であることは承知していますが、ほとんどの (?) データベース システムのサイレント アクセスは、その能力を最大限に発揮して接続をプールします。

余談ですが、データベース間の接続により、接続数に問題が発生しました。Informix はシノニムをサポートしているため、一般的な犯罪者をシノニム化し、複数の接続がサーバー側で処理されるようになり、転送時間、接続作成のオーバーヘッド、および (この状況の真の核心である) ライセンス料金が大幅に節約されました。

リクエストがサーバー上で反復的に実行され、毎回ブロックされるため、リクエストが非同期的に送信されていないためだと思います。接続を作成するだけでよいのに、毎回接続を作成するオーバーヘッドを支払う必要があります。一度...

Flex では、すべての Web サービス呼び出しが自動的に非同期で呼び出されるため、複数の接続が表示されたり、同じ接続上でリクエストがキューに入れられたりすることがよくあります。

非同期リクエストでは、リクエスト/応答時間が短縮されるため、接続コストが軽減されます。 簡単に スレッド化を行わずに PHP でこれを実現すると、同じ接続を単純に再利用するよりもパフォーマンスへの影響が大きくなります。

それは私の2セントです...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top