Тайм-ауты случайных соединений SQL 2005 / лучшие практики относительно тайм-аутов БД - PullRequest
3 голосов
/ 16 июня 2009

Я использую тип ADO.Net SqlCommand и задаю для параметра CommandTimeout значение 30 секунд.

Моя проблема в том, что соединение / команда истекает по тайм-ауту, вызывая необработанные исключения, которые приводят к сбою моей системы!

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

Итак, мой вопрос; Как избежать / устранить проблемы с тайм-аутом базы данных?

Я не хочу устанавливать время ожидания более 30 секунд, так как у меня есть код, критичный ко времени.

Спасибо

Ответы [ 3 ]

4 голосов
/ 16 июня 2009
  1. Обработка исключений, чтобы они не приводили к краху вашей системы
  2. Исправьте вызовы вашей базы данных, чтобы они не прерывались

Обе вышеуказанные проблемы должны быть реализованы. Вызов базы данных всегда может генерировать исключения, независимо от того, какие меры предосторожности вы принимаете, поэтому вы должны обработать исключение, точка.

Если ваши звонки занимают более 30 секунд, это означает, что вы либо выполняете ОЧЕНЬ МНОГО обработки, либо вы все время заблокированы. Скорее всего, вы заблокированы все время. Чтобы уменьшить блокировку, уменьшите объем и продолжительность ваших замков. Дать более подробный ответ на такой общий вопрос означало бы в основном повторить все принципы теории обработки транзакций ...

0 голосов
/ 16 июня 2009

Согласитесь с Ремусом, обработайте тайм-аут, если он произойдет.

Существует много возможностей для оптимизации запроса к базе данных. Это не конкретное, если у меня нет деталей, но вы можете попробовать

Использование профиля sql для оптимизации запросов Используйте хранимые процедуры, а не встроенный код Оптимизируйте схему базы данных, включите индекс, где столбец может помочь. Попробуйте подкачку, если вы возвращаете много строк Верните только то, что вам нужно. Если время ожидания не связано с блокировкой, вот отличная статья -

http://searchsqlserver.techtarget.com/generic/0,295582,sid87_gci1339694,00.html

http://vyaskn.tripod.com/sql_odbc_timeout_expired.htm

0 голосов
/ 16 июня 2009

Мое приложение было установлено в сети клиента, которая была ОЧЕНЬ ненадежной ... нам пришлось повторить выполнение команды после потерянного соединения, потому что во второй раз она обычно проходила (мы говорим об SQL Server 2005 здесь).

Предполагая, что вы используете транзакции (если нет, то вам следует), вот моя оболочка Commit Transaction, которая довольно хорошо обрабатывает потерянные соединения (я думаю, ее можно оптимизировать ... но это просто копирование / вставка из моего кода):

Public Shared Function SafeCommitRollback(ByVal Trans As SqlClient.SqlTransaction, Optional ByVal Action As TROperation = TROperation.Commit, Optional ByVal QuietMode As Boolean = False) As Boolean
    SafeCommitRollback = False
Dim TryRollback As Boolean = False
Dim ConnLost As Boolean = False
Dim msgErr As String = ""

If Action = TROperation.Commit Then
    Try
        Trans.Commit()
        SafeCommitRollback = True
    Catch ex As SqlClient.SqlException When ex.Class = 20 OrElse (ex.Class = 11 And ex.Number = -2)
        ConnLost = True
    Catch ex As System.InvalidOperationException When ex.Source = "System.Data" 'AndAlso ex.Message.StartsWith("Timeout expired.")
        ConnLost = True
    Catch ex As Exception
        TryRollback = True
        msgErr &= clsErrorHandling.ParseException(ex, True)
    End Try

    If ConnLost Then
        Try
            Trans.Commit()
            SafeCommitRollback = True
        Catch ex2 As Exception
            TryRollback = True
            msgErr &= clsErrorHandling.ParseException(ex2, True)
        End Try
    End If
Else
    TryRollback = True
End If


If TryRollback Then
    Try
        Trans.Rollback()
        If Action = TROperation.Rollback Then SafeCommitRollback = True
    Catch ex3 As Exception
        msgErr &= clsErrorHandling.ParseException(ex3)
    End Try
End If

    If Not QuietMode AndAlso msgErr.Trim <> "" Then clsMessageBox.ShowError(msgErr)
End Function

Надеюсь, это поможет ...

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