我在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();
}
答案 0 :(得分:14)
检查数据库中任何长时间运行的查询。
增加游泳池大小只会让你的网络应用程序活得更长一些(并且可能会慢很多)
您可以使用sql server profiler并对持续时间/读取进行过滤,以查看哪些查询需要优化。
我也看到你可能保持全球联系?
blnMainConnectionIsCreatedLocal
让.net为您做池,并使用using语句打开/关闭您的连接。
建议:
始终打开并关闭这样的连接,以便.net可以管理您的连接,并且您不会用完连接:
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
// do some stuff
} //conn disposed
正如我所提到的,请使用 sql server profiler 检查您的查询,看看您是否可以对其进行优化。对Web应用程序中的许多请求进行慢速查询也可以提供这些超时。
答案 1 :(得分:12)
这也是你也可以尝试的......
运行你的应用程序....当它仍在运行时启动命令提示符
在应用程序运行时,在命令提示符下键入 netstat -n 。您应该看到TCP / IP连接列表。检查您的清单是否不长。理想情况下,列表中的连接数应少于5个。检查连接状态 如果您有太多具有TIME_WAIT状态的连接,则表示连接已关闭,正在等待操作系统释放资源。如果您在Windows上运行,则默认的临时端口范围在1024到5000之间,Windows从TIME_WAIT状态释放资源所需的默认时间为4分钟。因此,如果您的应用程序在不到4分钟内使用了超过3976个连接,您将获得例外。
修复建议:
如果您继续收到相同的错误消息(极不可能),您可以尝试以下操作:(如果您不熟悉Windows注册表,请不要这样做) < / p>
修改设置,使其显示为:
MaxUserPort = dword:00004e20(10,000十进制) TcpTimedWaitDelay = dword:0000001e(30十进制)
这会将端口数增加到10,000,并减少释放释放的tcp / ip连接的时间。
如果1失败,则仅使用建议2。
谢谢。
答案 2 :(得分:6)
可能是这是alltime多连接打开问题,您在代码中打开连接并且没有正确关闭它们。使用
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
}
参考这篇文章:http://msdn.microsoft.com/en-us/library/ms254507(v=vs.80).aspx,当代码退出块时,Visual Basic或C#中的Using块会自动处理连接,即使在未处理的异常情况下也是如此。 < / p>
答案 3 :(得分:5)
在开始诅咒应用程序之前,您需要检查一下:
您的应用程序是否是唯一使用该SQL Server实例的应用程序。 一个。如果答案为否,那么您需要调查其他应用程序如何消耗SQl Server.run上的资源 湾如果答案是肯定的,那么您必须调查您的申请。
运行SQL Server Profiler并使用SQL Server检查其他应用程序(1a)中正在进行的活动,并检查您的应用程序(1b)。
如果你的申请确实缺乏资源,那么你需要进行更多的调查。有关此http://sqlserverplanet.com/troubleshooting/sql-server-slowness