如何解决最大连接池错误
本文关键字:连接 错误 何解决 解决 | 更新日期: 2023-09-27 18:07:50
我有一个应用程序在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();
}
检查数据库中是否有长时间运行的查询
增加你的池大小只会让你的web应用程序活得更长(可能会变得更慢)
您可以使用sql server profiler和filter对持续时间/读取来查看哪些查询需要优化。
我还看到你可能保持全球联系?
blnMainConnectionIsCreatedLocal
让。net为你做池,并使用using语句打开/关闭你的连接。
建议:
总是打开和关闭这样的连接,所以。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状态的连接太多,则表示该连接已关闭,正在等待操作系统释放资源。如果您在Windows上运行,默认的临时端口范围在1024到5000之间,Windows从TIME_WAIT状态释放资源的默认时间为4分钟。因此,如果您的应用程序在不到4分钟的时间内使用了超过3976个连接,您将得到您所得到的异常。
修复建议:
- 添加一个连接池到您的连接字符串
如果您继续收到相同的错误信息(这是极不可能的),您可以尝试以下操作:(如果您不熟悉Windows注册表,请不要这样做)
- 从运行命令中运行regedit。在注册表编辑器中查找此注册表项:HKEY_LOCAL_MACHINE'SYSTEM'CurrentControlSet'Services'Tcpip'Parameters:
修改设置,使其为:
MaxUserPort = dword:00004e20(10000十进制)TcpTimedWaitDelay = dword:0000001e (30 decimal)
这将增加端口数量到10,000,并减少释放空闲tcp/ip连接的时间。
谢谢。
可能这是所有时间多个连接打开的问题,您在代码的某个地方打开连接,而不是正确关闭它们。使用
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
}
参考本文:http://msdn.microsoft.com/en-us/library/ms254507(v=vs.80).aspx, Visual Basic或c#中的Using块在代码退出块时自动处理连接,即使在未处理的异常情况下。
在开始诅咒你的应用程序之前,你需要检查一下:
-
您的应用程序是唯一使用该SQL Server实例的应用程序吗?a.如果答案是否定的,那么你需要调查其他应用程序是如何消耗你的SQl Server.run上的资源的b.如果答案是肯定的,那么你必须调查你的申请。
-
运行SQL Server Profiler并检查在使用SQL Server的其他应用程序(1a)中发生的活动,并检查您的应用程序(1b)。
-
如果您的应用程序确实缺乏资源,那么您需要进行进一步的调查。欲了解更多信息,请参阅http://sqlserverplanet.com/troubleshooting/sql-server-slowness