Управление истекшим временем ожидания входа в систему для SQL Server - PullRequest
0 голосов
/ 30 мая 2019

У меня следующий VB.NET-код выполняется каждый час.Код соединяется с этим сервером и этой базой данных и выполняет некоторые команды не только в базе данных MyDatabase, но также и в других базах данных на том же сервере.

Поскольку пользователь является системным администратором, он имеет доступ администратора ко всембазы данных без проблем.

Dim ConnStr As String
Dim Conn As SqlConnection
Dim cM As SqlCommand
Try
    ConnStr = "Server=MyServer;Database=MyDatabase;User Id=MyUsername;Password=MyPassword;Connect Timeout=300"
    Dim Conn As New SqlConnection(ConnStr)
    cM = New SqlCommand("", Conn) 'The SQL code comes from an script file (*.sql)
    cM.CommandTimeout = 1800
    cM.Connection = Conn
    Conn.Open()
    cM.ExecuteNonQuery()
Catch eX As Exception
    Dim strError As String = ex.Message
    If Not ex.InnerException Is Nothing Then strError &= " | " & ex.InnerException.Message
    strError = "Connection Timeout: " & Conn.ConnectionTimeout.ToString & " | " & _
        "Command Timeout: " & cM.CommandTimeout.ToString & " | " & _
        strError
    objLogging.LogErrorStep(JobID, JobName, CurrentStepName, strError)
Finally
    If Conn.State = ConnectionState.Open Then Conn.Close()
    Conn.Dispose()
End Try

Проблема, с которой мы экспериментируем, заключается в том, что некоторые из прогонов этого задания не выполняются из-за ошибок истечения времени ожидания входа в систему:

Connection Timeout: 300 | Command Timeout: 1800 | TCP Provider: Timeout error [258]. 
OLE DB provider "SQLNCLI10" for linked server "(null)" returned message "Login timeout expired".
OLE DB provider "SQLNCLI10" for linked server "(null)" returned message "Unable to complete login process due to delay in prelogin response".

Как вы можете видеть вкод, я сохраняю ошибки в таблице ведения журнала, а также сохраняю там текущее время ожидания подключения и текущее время ожидания команды.

Я удивлен тем, что когда я проверяю ошибки в своей таблице ведения журнала,Я могу видеть истекшее время между временем начала команды и временем сбоя команды, и истекшее время составило всего 15 секунд, когда мое Время ожидания соединения установлено на 300. Посмотрите на следующее изображение:

enter image description here

Как видите, разница между EventStart и EventStop составляет около 15 секунд.Если процесс завершается неудачно из-за тайм-аута соединения, и он установлен на 300, истекшее время должно быть 300, не так ли?

Спасибо за вашу помощь и комментарии.

РЕДАКТИРОВАТЬ 2019-05-31

После ожидания еще одного дня, установив свойство Connect Timeout = 300 в OPEDATASOURCE connectionString, я получил новый тайм-аут входа, истекший сегодня днем, также всего через 15 секунд (см. Изображение)

enter image description here

1 Ответ

0 голосов
/ 30 мая 2019

Параметры тайм-аута подключения и CommandTimeout применяются к подключению от клиента к «MyDatabase».Поскольку ваша команда SQL подключается к связанным серверам, эти параметры не будут передаваться автоматически и должны быть настроены на уровне SQL Server.Обратите внимание, что это изменение применяется немедленно и распространяется на весь сервер (T-SQL):

EXEC sp_configure 'remote login timeout', 300;  
GO  
RECONFIGURE ;  
GO  

EXEC sp_configure 'remote query timeout', 1800;  
GO  
RECONFIGURE ;  
GO

См. Эти две связанные ссылки MSDN:

Тайм-аут удаленного входа в систему

Тайм-аут удаленного запроса

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