2009-05-01 18 views
26

我在4個Windows 2003計算機的場中部署了幾個ASP.NET應用程序。每個應用程序在IIS中使用單獨的應用程序池和虛擬目錄。他們嚴重依賴在單個SQL Server 2000上持續保留out of process的會話(<sessionstate mode="sqlserver" ... />)。應用程序是針對.NET 3.0編譯的,但.NET 3.5 SP1安裝在服務器上。使用進程外會話狀態的ASP.NET應用程序中SQL Server的連接問題

每個Web服務器接收大約10個請求/秒。每隔一段時間,我得到的日誌中有一些例外:

System.Data.SqlClient.SqlException: A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The semaphore timeout period has expired.) 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) 
    at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() 
    at System.Data.SqlClient.TdsParserStateObject.ReadBuffer() 
    at System.Data.SqlClient.TdsParserStateObject.ReadByte() 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) 
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
    at System.Web.SessionState.SqlSessionStateStore.SetAndReleaseItemExclusive(HttpContext context, String id, SessionStateStoreData item, Object lockId, Boolean newItem) 

或其他:

System.Data.SqlClient.SqlException: A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.WriteSni() 
    at System.Data.SqlClient.TdsParserStateObject.WritePacket(Byte flushMode) 
    at System.Data.SqlClient.TdsParserStateObject.ExecuteFlush() 
    at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) 
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
    at System.Web.SessionState.SqlSessionStateStore.SetAndReleaseItemExclusive(HttpContext context, String id, SessionStateStoreData item, Object lockId, Boolean newItem) 

或另一個:

System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) 
    at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() 
    at System.Data.SqlClient.TdsParserStateObject.ReadBuffer() 
    at System.Data.SqlClient.TdsParserStateObject.ReadByte() 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 
    at System.Data.SqlClient.SqlDataReader.get_MetaData() 
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader() 
    at System.Web.SessionState.SqlSessionStateStore.DoGet(HttpContext context, String id, Boolean getExclusive, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actionFlags) 

這些錯誤發生幾次一天約1-2分鐘後消失。有沒有人遇到這樣的問題?你可以建議我做些什麼來進一步追蹤問題?對我來說,它看起來更像網絡問題而不是應用程序它可能是SQL Server上的一些設置,無法處理這麼多的併發連接?任何建議將不勝感激。


UPDATE:

我已經解決了,以減少對象的數量和大小進行重大更新應用程序的問題被存儲在會話中。

回答

14

傳輸級別的錯誤通常與連接到sql server的連接斷開......通常是網絡連接。

超時過期通常在SQL查詢運行時間太長時引發。

因此,我會排查鏈接到您的Sql Server,然後監視,看看什麼查詢超時。

聲音就像一個SQL作業正在運行,備份?這可能是鎖定表或重新啓動服務。

+0

感謝提示@Deviant。我會檢查這些併發布結果。 – 2009-05-01 09:12:08

1

在連接字符串中設置CommandTimeout = 120。

嘗試在web.config中添加一個連接超時:

<add key="DBConnection" value="server=LocalHost;uid=sa;pwd=;database=DataBaseName;Connect Timeout=200; pooling='true'; Max Pool Size=200"/> 

請回復,如果這個工程....

+9

我沒有給你一個減號-1,因爲我相信你應該知道爲什麼人們標記你爲這個答案。增加超時甚至池並不能解決潛在的問題,如果再次發生這種錯誤,它只會增加失敗的規模。 – Luke 2011-12-09 06:46:48

+1

完全不同意。如果您確實需要執行一個非常大的單個命令,例如在單個DELETE語句中刪除數千行,則需要增加Commandtimeout。通常情況下,您應該重新考慮問題以避免這種情況,但有時您需要比默認30秒更高的Commandtimeout,如http://stackoverflow.com/questions/11747368/set-command-timeout-in-entity-framework- 4-3你還應該尋找另一個問題,比如鎖...... – 2013-04-16 14:08:28

1

這可能是在您的查詢的長度超過了的情況下限制65,536 * 網絡數據包大小(默認4KB)。

4

在我的情況下,問題與主機TCP配置(VMWare中的虛擬機)有關。經過快速調查(some article在Google和MSDN Blogs中找到)我已在系統註冊表中關閉:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\synattackprotect(0)和HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnableTCPChimney(0)。 現在它工作得很好。當然,這只是測試機器(企業網絡不能從互聯網上看到),我不會在生產環境中這麼做;-)

相關問題