Как я могу сохранить свое соединение с SQL Server Express от тайм-аута при первом тестировании? - PullRequest
0 голосов
/ 17 апреля 2009

У нас есть несколько автоматических тестов для взаимодействия между нашим уровнем доступа к данным (C #) и базой данных (MS SQL). Мы используем SQL Express для монтирования mdf, который мы возвращаем после завершения тестирования. Кажется, что при первом запуске тестов на только что загруженной машине мы видим тайм-ауты, хотя SQLExpress работает. Во второй раз они работают просто отлично.

Пример строки запроса:

Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\TEST_DATA.mdf; Integrated Security=True; User Instance=True

Пример ошибки:

   [nunit2] 1) Test : System.Data.SqlClient.SqlException : Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   [nunit2]    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   [nunit2]    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   [nunit2]    at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
   [nunit2]    at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
   [nunit2]    at System.Data.SqlClient.TdsParserStateObject.ReadPacket(Int32 bytesExpected)
   [nunit2]    at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
   [nunit2]    at System.Data.SqlClient.TdsParserStateObject.ReadByte()
   [nunit2]    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   [nunit2]    at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
   [nunit2]    at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)
   [nunit2]    at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
   [nunit2]    at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
   [nunit2]    at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
   [nunit2]    at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
   [nunit2]    at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
   [nunit2]    at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
   [nunit2]    at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
   [nunit2]    at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
   [nunit2]    at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   [nunit2]    at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   [nunit2]    at System.Data.SqlClient.SqlConnection.Open()
   [nunit2]    at Test()

Кто-нибудь испытывал это? Вы нашли способ обойти это?

Ответы [ 2 ]

1 голос
/ 17 апреля 2009

Возможно, БД все еще восстанавливается, когда вы нажимаете на него в первый раз, или когда установлено автоматическое закрытие, и когда вы нажимаете на него в первый раз, его должен открыть двигатель. Проверьте этот параметр, выполнив следующее, замените msdb на имя вашей базы данных, если возвращается 1, то у вас установлено значение autoclose

SELECT DATABASEPROPERTYEX( 'msdb' , 'IsAutoClose' )
0 голосов
/ 24 апреля 2009

Похоже, что у этой проблемы нет другого решения, кроме как увеличить время ожидания соединения или просто повторить попытку. Это просто стоимость сервера, раскручивающего БД в новой системе. В моем тестировании это происходит после перезагрузки, но остановка и запуск службы SQL не вызывает проблемы. Эта тема на EE ставит аналогичный вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...