如何解决最大连接池错误
我在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 server profiler并过滤持续时间/读取以查看哪些查询需要优化。
我也看到你可能保持全球联系?
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(10,000十进制)TcpTimedWaitDelay = dword:0000001e(十进制30)
这会将端口数增加到10,000,并减少释放释放的tcp / ip连接的时间。
如果1失败,仅使用建议2。
谢谢。
可能这是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块在代码退出块时自动处理连接即使在未处理的例外情况下也是如此。
在开始诅咒应用程序之前,您需要检查以下内容:
-
您的应用程序是唯一使用该SQL Server实例的应用程序。 一个。 如果答案为否,那么您需要调查其他应用程序如何消耗SQl Server上的资源。运行b。 如果答案是肯定的,那么您必须调查您的申请。
-
运行SQL Server Profiler并使用SQL Server检查其他应用程序(1a)中发生的活动,并检查您的应用程序(1b)。
-
如果您的应用程序确实缺乏资源,那么您需要进行进一步的调查。 有关此http://sqlserverplanet.com/troubleshooting/sql-server-slowness的更多信息,请参阅