2016-10-10 2 views
2

У меня возникла проблема с библиотекой .net, подключающейся к экземпляру SQL Server..net + SQL + Timeout issue

Библиотека является частью приложения, которое вставляет содержимое файлов edi в базу данных SQL Server 2008 R2.

Каждый раз, когда вызывается библиотека, она выдает исключение (№ 1 ниже), в котором указано, что время соединения завершено. На рассматриваемом сервере существует несколько других приложений non .net, которые используют одну и ту же строку соединения и работают отлично.

Я также установил приложение, содержащее библиотеку, на другой сетевой машине, и он отлично работает оттуда.

вещи я попытался:

Установка .CommandTimeout = 150; - Тайм-аут до 150 секунд.
Переустановка все .NET Frameworks
Rebooting сервер приложений & сервер БД
Переключение из контекста данных стандартных запросов адаптера данных.
Создал автономный 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.Изменение RemoteQuery тайм-аут до 0 ..

Далее мы также отключить TCP Chimney на всех наших серверах

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

Теперь мы 100% уверены, сеть не является фактором в тайм-аутов, даже тогда, если запрос не будет со временем out, когда выполняется, хотя SQLagent или некоторые вещь еще

1.We попытаемся обновить статистику
2.We увидит, если есть шанс для оптимизации ..

Вы также можете обратиться к this blog, где OP упоминается все тайм-ауты, которые могут произойти

При попытке получить соединение из пула соединений SqlClient
При попытке создать новое свежее подключение к серверу (не получает один из пула)
при отправке команды явно на сервер
при отправке команды с «контекстом соединением = истиной»
при передаче команд неявно (под одеялом) на сервер
При выполнении асинхронных команд (BeginExecute ...)
При ожидании подтверждения внимания от сервера (особый редкий случай)
При отправке TM команды
При получении строки
При загрузке строки с помощью массового копирования