web-dev-qa-db-ja.com

最大接続プールエラーを解決する方法

Asp.net 3.5にアプリケーションがあり、データベースはSQL Server 2005です。

_"Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached."
_

しばらくすると、このエラーが発生しました。このエラーの解決方法。

SqlConnection.ClearAllPools();を試してみましたが、これも機能しません。

_SqlCommand cmdToExecute = new SqlCommand();
            cmdToExecute.CommandText = "dbo.[sp_user_listing]";
            cmdToExecute.CommandType = CommandType.StoredProcedure;
            DataTable toReturn = new DataTable("courier_user_listing");
            SqlDataAdapter adapter = new SqlDataAdapter(cmdToExecute);

            // Use base class' connection object
            cmdToExecute.Connection = sqMainConnection;

            try
            {
                cmdToExecute.Parameters.Add(new SqlParameter("@suser_name", SqlDbType.VarChar, 250, ParameterDirection.Input, true, 0, 0, "", DataRowVersion.Proposed, _user_name));


                if (blnMainConnectionIsCreatedLocal)
                {
                    // Open connection.
                    sqMainConnection.Open();
                }
                else
                {
                    if (CPMainConnectionProvider.IsTransactionPending)
                    {
                        cmdToExecute.Transaction = CPMainConnectionProvider.CurrentTransaction;
                    }
                }

                // Execute query.
                adapter.Fill(toReturn);
                i32ErrorCode = (Int32)cmdToExecute.Parameters["@iErrorCode"].Value;

                if (i32ErrorCode != (int)LLBLError.AllOk)
                {
                    // Throw error.
                    throw new Exception("Stored Procedure 'sp_courier_user_SelectAll' reported the ErrorCode: " + i32ErrorCode);
                }

                return toReturn;
            }
            catch (Exception ex)
            {
                // some error occured. Bubble it to caller and encapsulate Exception object
                throw new Exception("Courier_user::SelectAll::Error occured.", ex);
            }
            finally
            {
                if (blnMainConnectionIsCreatedLocal)
                {
                    // Close connection.
                    sqMainConnection.Close();
                }
                cmdToExecute.Dispose();
                adapter.Dispose();
            }
_
23
Harshit Tailor

データベースで長時間実行されているクエリをチェックします。

プールサイズを大きくしても、webappのライブは少し長くなります(そして、おそらくかなり遅くなります)

SQLサーバープロファイラーを使用して、継続時間/読み取りでフィルター処理し、最適化が必要なクエリを確認できます。

また、おそらくグローバル接続を維持しているのを見ますか?

blnMainConnectionIsCreatedLocal

.netにプールを行わせ、usingステートメントを使用して接続を開閉します。

提案:

  1. 常に開いており、closeこのような接続なので、.netは接続を管理でき、接続が不足することはありません。

        using (SqlConnection conn = new SqlConnection(connectionString))
        {
         conn.Open();
         // do some stuff
        } //conn disposed
    
  2. 前述のとおり、クエリをsql server profilerでチェックし、最適化できるかどうかを確認します。 Webアプリで多数のリクエストを含む遅いクエリを使用すると、これらのタイムアウトも発生する可能性があります。

14

こちらも試してみてください。

アプリケーションを実行します...まだ実行中にコマンドプロンプトを起動します

アプリケーションの実行中に、コマンドプロンプトでnetstat -nと入力します。 TCP/IP接続のリストが表示されます。リストがそれほど長くないか確認してください。理想的には、リスト内の接続は5つ未満にする必要があります。接続の状態を確認します。
TIME_WAITステータスの接続が多すぎる場合、接続が閉じられ、OSがリソースを解放するのを待っていることを意味します。 Windowsで実行している場合、デフォルトのエフェメラルポートは1024〜5000の範囲で鳴り、WindowsがリソースをTIME_WAITステータスから解放するのにかかるデフォルトの時間は4分です。そのため、アプリケーションが4分以内に3976を超える接続を使用した場合、例外が発生します。

修正する提案:

  1. 接続プールを接続文字列に追加します。

同じエラーメッセージが引き続き表示される場合(これは非常に可能性が低い)、次を試すことができます。(Windowsレジストリに慣れていない場合は実行しないでください)

  1. Runコマンドからregeditを実行します。レジストリエディタで、次のレジストリキーを探します。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters:

次のように設定を変更します。

MaxUserPort = dword:00004e20(10進数10,000)TcpTimedWaitDelay = dword:0000001e(10進数30)

これにより、ポートの数が10,000に増え、解放されたtcp/ip接続を解放する時間が短縮されます。

1が失敗した場合のみ提案2を使用します。

ありがとうございました。

12
Chamu

これは常に複数の接続が開いている問題であり、コードのどこかに接続を開いており、適切に閉じていない可能性があります。つかいます

 using (SqlConnection con = new SqlConnection(connectionString))
        {
            con.Open();
         }

この記事を参照してください: http://msdn.Microsoft.com/en-us/library/ms254507(v = vs.80).aspxUsingブロックVisual BasicまたはC#では、未処理の例外の場合でも、コードがブロックを終了すると、接続を自動的に破棄します。

6
Manoj Purohit

アプリケーションを呪う前に、これを確認する必要があります。

  1. SQL Serverのそのインスタンスを使用しているのは、アプリケーションだけです。 a。それに対する答えがNOの場合、他のアプリケーションがSQl Server.run上のリソースをどのように消費しているかを調査する必要があります。答えが「はい」の場合、アプリケーションを調査する必要があります。

  2. SQL Server Profilerを実行し、SQL Serverを使用して他のアプリケーションで発生しているアクティビティを確認し(1a)、アプリケーションも確認します(1b)。

  3. 実際にアプリケーションのリソースが不足している場合は、さらに調査する必要があります。詳細については http://sqlserverplanet.com/troubleshooting/sql-server-slowness

5
Chamu