2008-08-26 5 views
1

シングルトンについてのディスカッションPHP私はこの問題についてますます考えています。ほとんどの人は、1回のリクエストでDB接続の束を作ってはいけないと教えています。私はあなたの推論が何であるか興味があります。私の最初の考えは、DBへの多くのリクエストを作成するためのスクリプトへの費用ですが、次に複数の接続で同時にクエリを効率的にすることはできないのでしょうか?なぜ1回のリクエストで複数のデータベース接続を行うのが悪いのですか?

知り合いの人からの回答(エビデンス、人々)はどうですか?

答えて

6

データベース接続は、限られたリソースです。一部のDBでは接続の制限が非常に低く、接続を無駄にすることが大きな問題です。多くの接続を消費することによって、データベースを使用する他のユーザーをブロックしている可能性があります。アイドル座ってDBサーバ上のリソースがある場合を除き

また、DBに余分な接続のトンを投げることは何も解決しません。 8つのコアがあり、1つだけがクエリを満たすために使用されている場合は、別の接続を作成することが役立つかもしれません。ただし、使用可能なすべてのコアを既に使用している可能性があります。また、すべてのDB要求に対して同じハードドライブを使用し、ロック競合を追加する可能性があります。

あなたのDBは、高い利用率に似た何かを持っている場合は、追加の接続を追加することは助けにはなりません。それは余分な並行処理によって処理が速くなるという盲目的な希望を持って、アプリケーション内に余分なスレッドを生成するようなものです。一部の特定の状況ではかもしれませんが、ハードドライブをスラッシュしたり、タスクの切り替えに時間を浪費したり、同期オーバーヘッドを導入したりする場合は、遅くなるだけです。

3

接続をセットアップし、データを転送してから引き裂くのは、コストです。それはあなたのパフォーマンスを食べるでしょう。

証拠が

だが、それは接続を行うために、Xのマイクロ秒かかるとしましょう...で来るが、次の点を考慮することが困難です。

ここで、いくつかのリクエストを行い、前後にデータを取得したいとします。 1つの接続と多くの間で、移送時間の差が無視できるとしましょう(議論のためだけです)。

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

1つの接続を開くには、x + yマイクロ秒のオーバーヘッドが必要です。多くを開くと、n *(x + y)が取られます。それはあなたの実行を遅らせるでしょう。

0

リクエストが非同期的に送信されないのは、リクエストがサーバ上で反復的に実行され、毎回ブロックされ、毎回接続を作成するオーバーヘッドに費やす必要があるためです一度やり直す必要があります...

Flexでは、すべてのWebサービス呼び出しが自動的に非同期に呼び出されるため、複数の接続が表示されたり、同じ接続でキューに登録された要求が一般的です。

非同期リクエストが速く、要求/応答時間を通じて接続コストを軽減する...あなたには、いくつかのスレッドアウトせずにPHPでこれを達成できない簡単ことができるので、その後、パフォーマンスヒットは、単純に同じ接続を再利用し、その後も大きいです。

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

2

DB接続の設定は、通常非常に重いです。バックステージ(DNS解決/ TCP接続/ハンドシェイク/認証/実際のクエリ)の多くはです。

私はいくつかの奇妙なDNS設定で1回問題が発生しました。すべてのTCP接続に数秒かかりました。私のログイン手順(複雑なアーキテクチャのため)は、完了するために3つの異なるDB接続が必要でした。その問題で、ログインするのは永遠に続いていました。その後、コードをリファクタリングして1つの接続のみを行うようにしました。

1

.NETからInformixにアクセスし、複数の接続を使用します。各接続でトランザクションを開始しない限り、接続プールでトランザクションが処理されることがよくあります。私はそれがブランド特有のものであることはわかっていますが、ほとんどのデータベースシステムは、その能力を最大限引き出すために接続をプールします。

私は、データベース間の接続のために接続数に問題がありました。Informixはシノニムをサポートしているため、共通の犯罪者と同義であり、複数の接続はサーバ側で処理され、転送時間、接続作成のオーバーヘッド、および(シットアットシティーの実際の要点)ライセンス料が大幅に節約されました。

関連する問題