2010-03-02 114 views
1

问候, 我有以下问题。我有一个在IIS7下运行的WCF服务。应用程序连接到它,WCF服务向数据库发出一些请求。在SQL Server 2005的活动监视器中,我注意到在有102个活动连接之后,IIS7中的应用程序池挂起。在此之后,我无法连接到我的WCF服务。然后只有IIS7重新启动有帮助。 对于连接我使用的ChannelFactory,它的每个请求后关闭。我也介绍了这样的代码,以确保通道被关闭:IIS 7应用程序池 - 无法连接到WCF服务

catch (FaultException) 
{ 
    Factory.Abort(); 
    return null; 
} 
catch (CommunicationException) 
{ 
    Factory.Abort(); 

    return null; 
} 
catch (TimeoutException) 
{ 
    Factory.Abort(); 
    return null; 
} 
catch (Exception ex) 
{ 
    Factory.Abort(); 
    return null; 
} 

finally 
{ 
    Factory.Close(); 
    Factory.Abort(); 
} 

我也有以下behvavior为我服务类:

[ServiceBehavior(InstanceContextMode= InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Multiple, AutomaticSessionShutdown=true)] 

我也有我的服务网页以下.config文件:

<serviceBehaviors> 
<behavior name="Server.Service1Behavior"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 

     <serviceThrottling maxConcurrentCalls="2147483647" 
     maxConcurrentSessions="2147483647" 
     maxConcurrentInstances="2147483647" /> 

我试过了一切。请帮助我,因为用户不能这样工作。为什么在连接到数据库应用程序池的102个连接挂起后发生? 这里是数据库

internal SqlConnection CheckIfConnectionOpen() 
    { 
     if (_Connection.State != ConnectionState.Open) 
     { 
      _Connection.Open(); 
     } 
     return _Connection; 
    } 
using (SqlCommand cmd = new SqlCommand(query, _Connection)) 
    { 
CheckIfConnectionOpen(); 
//some parameters for sqlcommand here and execute nonQuery or execute reader 
} 

是否有人可以帮助我,是因为我仍然在寻找一个解决方案

回答

1

在一个长镜头下面的链接解释的情况下,当应用程序池的调用的代码崩溃它不会重新启动。如果可以重新启动它,应该可以降低问题的严重程度。

http://i.nconspicuo.us/2008/06/25/iis7-on-windows-server-2008-503-service-unavailable-error-application-pool-stops-unexpectedly/

你提到你已经检查了通道被关闭,这可能是件好事确认DB连接也关闭。

希望这会有所帮助!

+0

我已经设置StartAutomatically和增加失败的最大数量。我没有帮助。如何检查数据库连接是否已关闭? – 2010-03-03 00:04:50

+0

那它取决于你的数据访问层。你使用OR/M还是自己管理SessionScope/TransationScope/DBConnection对象? – Russell 2010-03-03 00:09:05

+0

我管理SessionScope/TransationScope/DBConnection的对象自己,每一个选择查询使用(SqlCommand的SQLCMD =新的SqlCommand(...))下面的语句开始,我也有在TransactionScope的“使用” – 2010-03-03 00:15:01

0

你可以建立一个web场(同一IIS多个进程),这将有助于减少问题,并依赖于一个单一的过程中少(如果死了,重新启动后,其他人可以在那里举行了堡垒。直到它重新启动

0

顺便说一句,你上面的代码等同于:

catch (Exception ex) 
{ 
    Factory.Abort(); 
    return null; 
} 
finally 
{ 
    Factory.Close(); 
    Factory.Abort(); 
} 

,它只是坏你可能想记录异常的地方,让你知道发生了什么

我想看看调用的代码e数据库。我担心你可能没有正确清理。

+0

这是调用的代码(_Connection.State!= ConnectionState.Open) { _Connection.Open();数据库内部SqlConnection CheckIfConnectionOpen() if(_Connection.State!= ConnectionState.Open) } return _Connection; } 使用(的SqlCommand CMD =新的SqlCommand(查询,_Connection)) { //一些参数的SqlCommand这里 //和执行nonQuery或执行读取器 } – 2010-03-03 07:03:23

+0

和实际捕捉代码不捕获任何异常,我只是从服务器的空响应。 – 2010-03-03 07:06:48

相关问题