C# 从池中获取连接之前的超时时间已过,所有池连接都在使用中,并且已达到最大池大小

C# 从池中获取连接之前的超时时间已过,所有池连接都在使用中,并且已达到最大池大小,c#,asp.net,sql-server-2012,ado.net,application-pool,C#,Asp.net,Sql Server 2012,Ado.net,Application Pool,我有一个exe,它给出了以下错误 超时已过期。获取数据之前经过的超时时间 来自池的连接。发生这种情况的原因可能是所有的 连接正在使用,已达到最大池大小 我使用语句创建了一个连接对象并关闭了它 中的连接最后阻塞 在exe连接字符串的web.config中,最大应用程序池大小值为200 我还使用sp_who2命令检查了连接,该命令显示了25个连接 private Dictionary<string, SomeObject> SomeMethod(int orderedXmlId, str

我有一个exe,它给出了以下错误

超时已过期。获取数据之前经过的超时时间 来自池的连接。发生这种情况的原因可能是所有的 连接正在使用,已达到最大池大小

我使用语句创建了一个连接对象并关闭了它 中的连接最后阻塞

在exe连接字符串的web.config中,最大应用程序池大小值为200

我还使用sp_who2命令检查了连接,该命令显示了25个连接

private Dictionary<string, SomeObject> SomeMethod(int orderedXmlId, string clientLogFilePath, ref bool errorGettingRMData)
        {
            Dictionary<string, SomeObject> someDictionary = new Dictionary<string, SomeObject>();
            //Create connection object
            using (SqlConnection connection = new SqlConnection(ConfigurationSettings.AppSettings["MasterDB"]))
            {
                SqlCommand command = null;
                try
                {
                    //open the connection
                    connection.Open();
                    command = new SqlCommand("someSP", connection);
                    command.CommandType = CommandType.StoredProcedure;
                    command.Parameters.AddWithValue("@someParameter", someParameter);
                    command.CommandTimeout = _commandTimeOut;

                    using (SqlDataReader someVariable = command.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        if (someVariable != null && someVariable.HasRows)
                        {
                            int intId = someVariable.GetOrdinal("intId");
                            int imageUrl = someVariable.GetOrdinal("imageUrl");
                            int contentLength = someVariable.GetOrdinal("contentLength");
                            int path = someVariable.GetOrdinal("path");
                            int parentId = someVariable.GetOrdinal("parentId");
                            int propertyId = someVariable.GetOrdinal("propertyId");

                            while (someVariable.Read())
                            {
                                using (SomeObject someUploadObject = new SomeObject())
                                {
                                    // Avoid this Exception: "An item with the same key has already been added".
                                    if (!someDictionary.ContainsKey(someVariable.GetString(intImageUrlOrdinal)))
                                    {
                                        someUploadObject.OrderedXmlId =
                                            someVariable.GetInt32(intOrderedXMLIdOrdinal);
                                        someUploadObject.ImageUrl = someVariable.GetString(intImageUrlOrdinal);
                                        someUploadObject.ContentLength =
                                            someVariable.GetInt64(intContentLengthOrdinal);
                                        someUploadObject.SaveAsPath = someVariable.GetString(intSaveAsPathOrdinal);
                                        someUploadObject.ParentOrderedXmlId =
                                            someVariable.GetInt32(intParentOrderedXmlIdOrdinal);
                                        someUploadObject.PropertyId = someVariable.GetString(intPropertyIdOrdinal);

                                        //Add to Dictionary
                                        someDictionary.Add(someUploadObject.ImageUrl, someUploadObject);
                                    }
                                    else
                                    {
                                        if (detailedLog)
                                        {
                                            AddToLog("SomeMethod: Image {0}, for id:{1} is already present in someDictionary",
                                                                     new object[] { someVariable.GetString(imageUrlOrdinal), lId }, 80,
                                                                     false, true, clientLogFilePath);
                                        }
                                    }
                                }
                            }
                            someVariable.Close();
                        }
                        //No records are found i.e. Datareader is empty
                        else
                        {
                            //Do nothing
                        }
                    }
                }
                catch (Exception ex)
                {
                    errorGettingData = true;
                    Logger.Write2Log("SomeMethod: Error in retrieving uploaded images for id:" + Id + "-" + ex.Message, true, 40, true, logFilePath);
                    SendMail(MailOption.exception, ex, logFilePath);
                }
                finally
                {
                    command = null;
                    if (connection != null)
                    {
                        connection.Close();
                    }
                }
                //Return list of Dictionary
                return someDictionary;
            }
        } //SomeMethod
private Dictionary SomeMethod(int-orderedXmlId,string-clientLogFilePath,ref-bool-errorGettingRMData)
{
Dictionary someDictionary=新字典();
//创建连接对象
使用(SqlConnection连接=新的SqlConnection(ConfigurationSettings.AppSettings[“MasterDB”]))
{
SqlCommand=null;
尝试
{
//打开连接
connection.Open();
command=newsqlcommand(“someSP”,连接);
command.CommandType=CommandType.storedProcess;
command.Parameters.AddWithValue(“@someParameter”,someParameter);
command.CommandTimeout=\u CommandTimeout;
使用(SqlDataReader someVariable=command.ExecuteReader(CommandBehavior.CloseConnection))
{
if(someVariable!=null&&someVariable.HasRows)
{
int intId=someVariable.GetOrdinal(“intId”);
int imageUrl=someVariable.GetOrdinal(“imageUrl”);
int contentLength=someVariable.GetOrdinal(“contentLength”);
int path=someVariable.GetOrdinal(“路径”);
int parentId=someVariable.GetOrdinal(“parentId”);
int propertyId=someVariable.GetOrdinal(“propertyId”);
while(someVariable.Read())
{
使用(SomeObject someUploadObject=new SomeObject())
{
//避免此异常:“已添加具有相同密钥的项”。
if(!someDictionary.ContainsKey(someVariable.GetString(intimageurlorinal)))
{
someUploadObject.OrderedXmlId=
GetInt32(intOrderedXMLIdOrdinal);
someUploadObject.ImageUrl=someVariable.GetString(亲密UrlOrdinal);
someUploadObject.ContentLength=
someVariable.GetInt64(IntContentLengtorDinal);
someUploadObject.SaveAsPath=someVariable.GetString(intSaveAsPathOrdinal);
someUploadObject.ParentOrderedXmlId=
GetInt32(intParentOrderedXmlIdOrdinal);
someUploadObject.PropertyId=someVariable.GetString(intPropertyIdOrdinal);
//添加到字典
添加(someUploadObject.ImageUrl,someUploadObject);
}
其他的
{
如果(详细日志)
{
AddToLog(“SomeMethod:Image{0},id:{1}的已存在于someDictionary中”,
新对象[]{someVariable.GetString(imageUrlOrdinal),lId},80,
false、true、clientLogFilePath);
}
}
}
}
someVariable.Close();
}
//未找到任何记录,即Datareader为空
其他的
{
//无所事事
}
}
}
捕获(例外情况除外)
{
errorGettingData=true;
Logger.Write2Log(“SomeMethod:检索id为“+id+”-“+ex.Message,true,40,true,logFilePath”的上载图像时出错);
SendMail(mailpoption.exception,ex,logFilePath);
}
最后
{
command=null;
if(连接!=null)
{
connection.Close();
}
}
//返回字典列表
返回字典;
}
}//somethod

知道这里可能出了什么问题吗?

嗯,错误是自我描述。从通常的嫌疑犯开始:

  • 检查您的服务器是否真正使用了您想要的配置(而不是限制为25个连接的配置)。看看问题是否真的从这个数字开始
  • 如果可能的话,直接检查池-如果是您建立的连接被占用,那么您没有正确地丢弃它们-通常有一种模式可以处理这种情况。使用它,不要重新发明轮子

  • 这个错误是自我描述。从