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();
}
_
データベースで長時間実行されているクエリをチェックします。
プールサイズを大きくしても、webappのライブは少し長くなります(そして、おそらくかなり遅くなります)
SQLサーバープロファイラーを使用して、継続時間/読み取りでフィルター処理し、最適化が必要なクエリを確認できます。
また、おそらくグローバル接続を維持しているのを見ますか?
blnMainConnectionIsCreatedLocal
.netにプールを行わせ、usingステートメントを使用して接続を開閉します。
提案:
常に開いており、closeこのような接続なので、.netは接続を管理でき、接続が不足することはありません。
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
// do some stuff
} //conn disposed
前述のとおり、クエリをsql server profilerでチェックし、最適化できるかどうかを確認します。 Webアプリで多数のリクエストを含む遅いクエリを使用すると、これらのタイムアウトも発生する可能性があります。
こちらも試してみてください。
アプリケーションを実行します...まだ実行中にコマンドプロンプトを起動します
アプリケーションの実行中に、コマンドプロンプトでnetstat -nと入力します。 TCP/IP接続のリストが表示されます。リストがそれほど長くないか確認してください。理想的には、リスト内の接続は5つ未満にする必要があります。接続の状態を確認します。
TIME_WAITステータスの接続が多すぎる場合、接続が閉じられ、OSがリソースを解放するのを待っていることを意味します。 Windowsで実行している場合、デフォルトのエフェメラルポートは1024〜5000の範囲で鳴り、WindowsがリソースをTIME_WAITステータスから解放するのにかかるデフォルトの時間は4分です。そのため、アプリケーションが4分以内に3976を超える接続を使用した場合、例外が発生します。
修正する提案:
同じエラーメッセージが引き続き表示される場合(これは非常に可能性が低い)、次を試すことができます。(Windowsレジストリに慣れていない場合は実行しないでください)
次のように設定を変更します。
MaxUserPort = dword:00004e20(10進数10,000)TcpTimedWaitDelay = dword:0000001e(10進数30)
これにより、ポートの数が10,000に増え、解放されたtcp/ip接続を解放する時間が短縮されます。
1が失敗した場合のみ提案2を使用します。
ありがとうございました。
これは常に複数の接続が開いている問題であり、コードのどこかに接続を開いており、適切に閉じていない可能性があります。つかいます
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
}
この記事を参照してください: http://msdn.Microsoft.com/en-us/library/ms254507(v = vs.80).aspx 、UsingブロックVisual BasicまたはC#では、未処理の例外の場合でも、コードがブロックを終了すると、接続を自動的に破棄します。
アプリケーションを呪う前に、これを確認する必要があります。
SQL Serverのそのインスタンスを使用しているのは、アプリケーションだけです。 a。それに対する答えがNOの場合、他のアプリケーションがSQl Server.run上のリソースをどのように消費しているかを調査する必要があります。答えが「はい」の場合、アプリケーションを調査する必要があります。
SQL Server Profilerを実行し、SQL Serverを使用して他のアプリケーションで発生しているアクティビティを確認し(1a)、アプリケーションも確認します(1b)。
実際にアプリケーションのリソースが不足している場合は、さらに調査する必要があります。詳細については http://sqlserverplanet.com/troubleshooting/sql-server-slowness