6

私のC#アプリケーションでは、MySQLデータベースに接続して10,000個のクエリを実行します。データベースへの接続を維持する場合、これらのクエリには約14秒かかります。ただし、接続プールに依存している場合、クエリには約15秒かかります。(私はこのテストを複数回実行しました。)

// Connection pooling.
using (var connection = CreateConnection())
{
    connection.ConnectionString = ConnectionString;
    connection.Open();

ネット上のほとんどのサンプルは、上記の「接続して閉じる」構造を利用しています。ただし、接続プールは接続を維持するよりも遅いようです。だから問題は...

Q:接続プールを使用する必要があるのはなぜですか?

4

4 に答える 4

8

それは大きな議論の余地のあるトピックであり、そこに多くのブログがあり、なぜプールを使用するのかがわかります。

それは物事を遅くすることはありません。DBサーバーへの接続とハンドシェイク、およびクライアントとDBサーバー間の通信の確立には多くの時間がかかります。

そのため、サーバーが多くのリクエストを処理するマルチリクエストパラダイムでは、各クライアントを確立して待機することは困難です。POOLは、事前に準備された接続を提供し、それを使用して破棄するのに役立ちます。POOLはその接続を取得し、次のリクエストのために再確立します。

しかし、シングルスレッド環境では、その逆です。POOLは、シングルスレッド環境にとって非常に重いリソースになります。

于 2012-11-06T10:29:34.237 に答える
6

Q:接続プールを使用する必要があるのはなぜですか?

通常、一度に複数の接続を使用できるようにします。これはWebアプリケーションにとって明らかに重要です。あるユーザーのクエリが別のユーザーのクエリの終了を待つ必要はありません。

データベースと直接通信するシッククライアントアプリケーションを作成していて、一度に1つのクエリしか実行されないことがわかっている場合、それはそれほど重要ではありませんが、それでもグローバルな状態であり、回避する必要がある傾向があります。 。あなたはいくつかの独立したことをしています-なぜあなたはそれらが同じ接続を使用するように制約したいのですか?

于 2012-11-06T10:26:12.953 に答える
4

接続プーリングはスケーラビリティに最適です-100個のスレッド/クライアント/エンドユーザーがあり、それぞれがデータベースと通信する必要がある場合、それらすべてにデータベースへの専用接続を開かせたくありません(接続は高価なリソースです) )ではなく、(プーリングを介して)接続を共有します。

ミニパターンを使用すると、接続がタイムリーに閉じられ、接続でのトランザクションがすべて終了し、トランザクションによって取得されたロックが解放されるようにするのにも最適です。これは、パフォーマンスとデッドロックの可能性を最小限に抑えるのに非常に役立ちます。

于 2012-11-06T10:30:44.767 に答える
2

アプリケーションが10,000クエリを実行し、ユーザーの操作なしで再度閉じるだけの場合は、単一の接続を使用するのが問題ありません。

ただし、一般に、アプリケーションがユーザー入力を待っている間、データベース接続を開いたままにしておくことはお勧めできません。これは、接続プールが適切な場所です。

擬似コード..。

<open connection>
<fetch data>
<close connection>

<user interaction with data ...>

<open connection>
<save updated data>
<close connection>

使用する言語/データベースに応じて、2番目の接続は接続プールから生成されます。

于 2012-11-06T10:29:02.267 に答える