2010-03-02 111 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

相關問題