3 Stimmen

SQL 2005 zufällige Verbindungszeitüberschreitungen / bewährte Praktiken für Zeitüberschreitungen bei Datenbanken

Ich verwende den Typ ADO.Net SqlCommand und setze das CommandTimeout auf 30 Sekunden.

Mein Problem ist, dass die Verbindung/Befehl immer wieder zu unbehandelten Ausnahmen führt, die mein System zum Absturz bringen!

Die Daten, die ich abzurufen versuche, sind für das System von entscheidender Bedeutung - daher möchte ich die Zeitüberschreitungen beheben, anstatt eine Logik zur Wiederholung der Ausnahmebehandlung hinzuzufügen.

Meine Frage ist also: Wie vermeiden/beheben Sie Datenbank-Timeout-Probleme?

Ich möchte die Zeitüberschreitung nicht auf einen Wert von mehr als 30 Sekunden setzen, da ich zeitkritischen Code habe.

Gracias

4voto

Remus Rusanu Punkte 280155
  1. Behandlung von Ausnahmen, damit sie Ihr System nicht zum Absturz bringen
  2. Reparieren Sie Ihre Datenbankaufrufe, damit sie keine Zeitüberschreitungen verursachen

Die beiden oben genannten Punkte müssen umgesetzt werden. Ein Datenbankaufruf kann immer Ausnahmen auslösen, unabhängig davon, welche Vorsichtsmaßnahmen Sie treffen.

Wenn Ihre Anrufe mehr als 30 Sekunden dauern, bedeutet das, dass Sie entweder sehr viel bearbeiten oder dass Sie ständig blockiert sind. Höchstwahrscheinlich sind Sie die ganze Zeit blockiert. Um die Blockierung zu verringern, reduzieren Sie den Umfang und die Dauer Ihrer Sperren. Eine detailliertere Antwort auf eine so allgemeine Frage zu geben, würde im Grunde bedeuten, alle Prinzipien der Transaktionsverarbeitungstheorie zu wiederholen...

0voto

Rodolfo G. Punkte 331

Meine Anwendung wurde im Netzwerk eines Kunden installiert, das sehr unzuverlässig war... wir mussten die Ausführung eines Befehls nach einem Verbindungsabbruch wiederholen, weil er beim zweiten Mal normalerweise durchkam (wir sprechen hier von SQL Server 2005).

Angenommen, Sie sind mit Transaktionen (wenn nicht, dann sollten Sie), hier ist mein Commit Transaction Wrapper, die verlorene Verbindungen ziemlich gut behandelt (könnte optimiert werden, ich schätze... aber seine nur ein copy/paste von meinem Code):

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

Ich hoffe, das hilft...

0voto

Stuart Punkte 11115

Ich stimme mit Remus überein: Kümmern Sie sich um die Auszeit, wenn sie eintritt.

Bei der Optimierung der Datenbankabfrage gibt es viel Spielraum. Es ist nicht spezifisch, solange ich keine Details habe, aber Sie könnten versuchen

Sql-Profil zur Optimierung von Abfragen verwenden Stored Procedures verwenden, nicht Inline-Code Optimieren Sie das Datenbankschema, ein Index auf der where-Spalte könnte helfen. Versuchen Sie Paging, wenn Sie viele Zeilen zurückgeben Geben Sie nur zurück, was Sie brauchen. Wenn die Zeitüberschreitung nicht auf eine Blockierung zurückzuführen ist, finden Sie hier einen hervorragenden Artikel -

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X