2017-05-20 46 views
4

here多くのオープンした接続の接続プールは、毎回新しい接続を開くよりも、システムにとってコストがかかりません。

から答えは典型的には、データベース接続を開くことは高価な操作であり、接続が 後で要求された場合、アクティブなものの一つを優先して使用されるようにので プールがアクティブな接続を維持します〜 別のものを開く。

私は、DB管理におけるConnection Poolという概念を理解しています。それは "は〜です"という質問に対する答えです。すべての開発者がブログ、投稿、回答、チュートリアル、DB文書などをブログに投稿して、いつも "は何ですか"と答えています()。彼らは常に互いからテキストをコピー/ペーストするように。誰も "なぜそれなのですか" "と" how "について説明しようとしません。上記の答えがその例です。

私はたとえば、プール内の30開かれた接続を維持することは、それが必要なときに新しい接続を開くことよりも、システムの低コストであることも可能であるかなぜを理解することはできません。

オーストラリアにはWebサーバーがあります。また、オレゴンのどこかの米国にあるAWSのDB。またはGB。またはどこからでもAUSから非常に遠い。だから、彼らは、20 -...開かれた接続のプールを保つことは、そのような場合毎回新しい接続を開くよりも、メモリとシステムのパフォーマンスにとってコストがかかりませんと言っています。どのようにすることができますか?どうして?

+2

接続を確立するには、エンドポイント、メモリ割り当てなどの間で通信(ハンドシェイクと考える)が必要です。また、DBのやりとりを行うためにループを実行する場合、同じアクティブな接続を再利用する方がずっと優れていますループ内での開閉。 1つの接続を作成するためのわずかな違いがあっても、それはループで掛け合わされます。 –

+2

グリーン、それは価値があるので、この質問を促した回答に追加情報を追加しました。http://stackoverflow.com/questions/4041114/what-is-database-pooling/4041136#4041136を参照してください。しかし、ミッチとマリアは基本的に正しいです。接続は瞬間的なプロセスではありません。 – paxdiablo

答えて

3

あなたのシナリオでは、最大の問題はネットワーク遅延です。 2つの異なる大陸にあるサーバー間の通信が特に高速であるとは期待できません。したがって、必要なときに毎回新しい接続を開始すれば、毎回この待ち時間が発生します。 hereから

:データベースサーバへの接続

は通常、数時間のかかるステップで構成されています。 ソケットや名前付きパイプなどの物理チャネルを確立する必要があります。サーバーとの初期ハンドシェイクはでなければなりません。接続文字列情報を解析する必要があります。接続はサーバーによって認証されている必要があります。現在のトランザクションなどが含まれます。通常のハンドシェイクに加えて

ウェブサーバとデータベースの間の接続は、SSL/TLSを使用する場合も、実際の通信が発生する前に、すべての新しい接続にを実行しなければならないハンドシェイクがあります(ocurrsこと通常の接続では)。この握手は時間の点で高価です。

hereから:

クライアントとサーバがTLSを介してアプリケーションデータを交換を開始する前に、暗号化トンネルがネゴシエートされている必要があります。クライアントとサーバが選択し、TLSプロトコルのバージョンに同意しなければなりません暗号スイートを作成し、必要に応じて証明書を検証します。残念なことに、これらの各ステップでは、クライアントとサーバー間で新しいパケットラウンドトリップが必要となり、すべてのTLS接続に起動待ち時間が追加されます。 (...上記の交換が示すように)、新しいTLS接続を使用すると、接続プールを使用すると悪いニュースが

、このオーバーヘッドは、定期的に「pingのようなものを送信することにより回避されています - つまり「完全なハンドシェイク」のための2つのラウンドトリップが必要です'メッセージをSQLサーバーに送信して、非アクティブなためにタイムアウトからの接続を回避します。確かに、これはあなたのサーバーでより多くのメモリを消費する可能性がありますが、現在ではこれははるかに安価なリソースです。ネットワークの遅延は避けられません。

関連する問題