2010-06-29 3 views
7

Каковы случаи, когда тайм-аут возникает в SqlConnection.Open()?Почему может произойти тайм-аут в SqlConnection.Open()?

На одном из ящиков IIS через 10 секунд после того, как AppProcess был переработанной следующее исключение появилось:

Type : System.Data.SqlClient.SqlException, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
    Message : Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
    Source : .Net SqlClient Data Provider 
    Help link : 
    Errors : System.Data.SqlClient.SqlErrorCollection 
    Class : 11 
    LineNumber : 0 
    Number : -2 
    Procedure : 
    Server : XXX 
    State : 0 
    ErrorCode : -2146232060 
    Data : System.Collections.ListDictionaryInternal 
    TargetSite : Void OnError(System.Data.SqlClient.SqlException, Boolean) 
    Stack Trace : 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) 
     at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) 
     at System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover(Boolean useFailoverHost, String primaryHost, String failoverHost, 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 NHibernate.Connection.DriverConnectionProvider.GetConnection() 
     at NHibernate.Impl.SessionFactoryImpl.OpenConnection() 

По MSDNКоличество свойство содержит ошибки SQL Engine. Но я не смог найти ошибку -2 в master.dbo.sysmessages. Интервал между операциями, которые пытались открыть соединение, составлял около 3,5 секунд. Таймаут соединения не был явно изменен.

Через 2 секунды подобное исключение появилось для той же темы, но в другом месте. Стол вызовов был намного короче:

Type : System.Data.SqlClient.SqlException, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
Message : Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
Source : .Net SqlClient Data Provider 
Help link : 
Errors : System.Data.SqlClient.SqlErrorCollection 
Class : 11 
LineNumber : 0 
Number : -2 
Procedure : 
Server : XXX 
State : 0 
ErrorCode : -2146232060 
Data : System.Collections.ListDictionaryInternal 
TargetSite : Void OnError(System.Data.SqlClient.SqlException, Boolean) 
Stack Trace : 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 NHibernate.Connection.DriverConnectionProvider.GetConnection() 
    at NHibernate.Impl.SessionFactoryImpl.OpenConnection() 

Интервал между операциями, который пытается связываться с БД, и ошибка меньше секунды.

Вопросы: 1. Как воспроизвести такие ошибки? 2. Почему вызов стека короче во втором случае?

ответ

2

Похоже, проблема была вызвана зеркалированием. Та же ситуация описана here

0

Могут быть некоторые причины, такие как ваш SQL-сервер не может обработать вашу работу. Обычно сервер, на котором размещается SQL Server, работает с процессором Ram - CPU Process, и ваш SQL-запрос не дает ответа на ваш вызов. увеличьте время ожидания и подождите больше (если вы уверены, что все настройки соединения верны).

+0

Serkan - интервал между вызовом метода и ошибкой меньше обычного таймаута соединения (15 секунд). В другом случае это произошло почти сразу. –

+0

Так что, похоже, проблема связана с соединением. У меня есть вопрос. Ваш Sql работает на локальном или на сервере? Он работает на сервере, проверяет журналы событий сервера. Есть ли журнал о сети или Sql? –

+0

SQL-сервер удален, но у нас нет доступа к нему. Я отправил запрос в DBA. Просто интересно, что может вызвать проблему. –

1

Некоторые случаи таймаута в SqlConnection.Open() относятся к утечке соединения. Это может произойти, если пул соединений не подключен. Сначала вы должны проверить количество восстановленных счетчиков соединений машины IIS. Это должно быть 0. Если нет, вы должны проверить свой код, чтобы убедиться, что SQL-соединения закрыты должным образом.

+0

hakan, в этом случае будет другой тип исключения, хотя текст будет почти таким же: System.InvalidOperationException: время ожидания истекло. Период ожидания истекает до получения соединения из пула. Возможно, это произошло из-за того, что все объединенные соединения использовались и максимальный размер пула был достигнут. –

Смежные вопросы