2016-10-10 32 views
2

我遇到了連接到SQL Server實例的.net庫的問題。.net + SQL +超時問題

該庫是應用程序的一部分,它將edi文件的內容插入到SQL Server 2008 R2數據庫中。

每次調用該庫時,都會拋出一個異常(下面的#1),指出連接超時。有問題的服務器上還有多個其他非.net應用程序,它們使用相同的連接字符串並且完美地工作。

我還在另一臺聯網的機器上安裝了包含該庫的應用程序,並且從那裏可以正常工作。

事情我曾嘗試:

設置.CommandTimeout = 150; - 在150秒前超時。
重新安裝所有.NET框架的內置
重新啓動應用服務器& DB服務器
從數據上下文標準數據適配器查詢開關。
創建一個獨立的EXE來測試使用數據上下文和標準數據適配器查詢連接字符串 - 兩種方法第一次失敗,但然後連接並讀取所有後續嘗試的數據,直到EXE重新啓動。這導致我添加一個重試嘗試延遲到庫中的異常時被擊中,但這會導致異常2.

我現在處於虧損狀態。任何幫助,將不勝感激。

異常1:

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.TdsParser.ConsumePreLoginHandshake(Boolean encrypt, Boolean trustServerCert, Boolean& marsCapable) 
    at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnection owningObject, Boolean withFailover) 
    at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject, Boolean withFailover) 
    at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) 
    at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) 
    at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) 
    at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) 
    at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) 
    at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) 
    at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) 
    at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 
    at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 
    at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
    at System.Data.SqlClient.SqlConnection.Open() 
    at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) 
    at System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() 
    at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() 
    at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
    at System.Data.Linq.DataContext.ExecuteMethodCall(Object instance, MethodInfo methodInfo, Object[] parameters) 
    at System.Data.Linq.DataContext.ExecuteQuery[TResult](String query, Object[] parameters) 

<Query Execution method call> 

例外2:

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.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 
    at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 
    at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
    at System.Data.SqlClient.SqlConnection.Open() 
    at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) 
    at System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() 
    at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() 
    at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
    at System.Data.Linq.DataContext.ExecuteMethodCall(Object instance, MethodInfo methodInfo, Object[] parameters) 
    at System.Data.Linq.DataContext.ExecuteQuery[TResult](String query, Object[] parameters) 

<Query Execution method call> 

回答

0

設置.CommandTimeout

當查詢可以在指定的時間沒有得到總的數據發生..

在你的情況,可以有可能發生......我們解決了超時的方法在我們的情況下,通過下面的下面的許多超時步驟

1.Changed RemoteLoginTimeout 60
2.Change RemoteQuery超時0 ..

而且我們也對我們所有的服務器禁用TCP煙囪

https://blogs.msdn.microsoft.com/psssql/2010/02/21/tcp-offloading-again/

現在我們100%確定,網絡是不是在超時的一個因素,即使這樣,如果查詢失敗,時間當通過SQLagent或一些執行時其他東西

1.我們嘗試更新統計信息
2.我們將看到,如果有機會進行優化..

您也可以參考this blog,其中OP提到的所有超時可能發生

當試圖獲得來自SqlClient連接池的連接
當試圖建立到服務器的新新的連接(沒有得到一個從池)
當明確地發送命令到服務器
當與發送命令「上下文連接=真」
當隱式地發送命令(下蓋)到服務器
當執行異步命令(BeginExecute ...)
當等待來自服務器注​​意確認(特殊罕見的情況)
當發送命令TM
獲取當行
當使用批量複製載行