Konfigurierbare Wiederholungslogik (JDBC)

JDBC-Treiber herunterladen

Konfigurierbare Wiederholungslogik (Retry Logic, CRL) ist ein regelbasierter Mechanismus, mit dem fehlgeschlagene Anweisungen oder anfängliche Verbindungsversuche basierend auf SQL Server von Ihnen ausgewählten Fehlernummern automatisch erneut überprüft werden. Dabei handelt es sich um zeitbasierte Parameter, die Sie steuern. CRL wurde in Microsoft JDBC-Treiber 12.10 für SQL Server eingeführt.

CRL unterscheidet sich von der Resilienz der Leerlaufverbindung und den connectRetryCount / connectRetryInterval Eigenschaften. Die Leerlaufresilienz stellt fehlerhafte Verbindungen transparent wieder her und connectRetryCount wiederholt die anfängliche Authentifizierung in einem festen Zeitplan für eine integrierte Liste von vorübergehenden Fehlern. Mit CRL können Sie festlegen , welche Fehler erneut versucht werden können, wie oft und wie lange zwischen den Versuchen gewartet werden soll. Sie können alle drei Mechanismen zusammen verwenden.

CRL-Wiederholungen

CRL behandelt zwei unterschiedliche Szenarien, die jeweils durch ihre eigene Verbindungseigenschaft gesteuert werden:

Scenario Eigentum Wenn der Wiederholungsversuch ausgeführt wird Ausgelöst von
Fehler bei der Ausführung der Anweisung retryExec Beim Ausführen einer Anweisung (zum Beispiel executeQuery, executeUpdate, execute oder Stapelverarbeitung) Ein SQLServerException, dessen Fehlernummer mit einer konfigurierten Anweisungsregel übereinstimmt
Anfänglicher Verbindungs- oder Authentifizierungsfehler retryConn Innerhalb der Verbindungswiederholungsschleife des Treibers (die durch connectRetryCount und loginTimeout gesteuert wird) Ein SQLServerException während der Authentifizierung, dessen Fehlernummer einer konfigurierten Verbindungsregel entspricht, oder standardmäßig jeder vorübergehende Fehler, der bereits von der integrierten Liste für Wiederholungsversuche abgedeckt wird

Bei Anweisungen ruft der Treiber nur den fehlerhaften Befehl erneut auf. Der Treiber setzt den Status der aktuellen Transaktion nicht zurück. Gestalten Sie Ihre Regeln daher so, dass sie auf Fehler ausgelegt sind, nach denen die Sitzung weiterhin verwendbar bleibt, z. B. Deadlockopfer (1205) oder Sperrtimeout (1222).

Bei Verbindungen ergänzt oder ersetzt CRL die integrierte Liste des Treibers mit vorübergehenden Verbindungsfehlern. Informationen zur Präfixsemantik finden Sie unter "Wiederholungsregeln für die + Verbindung".

Aktivieren von CRL

CRL hat zwei Ebenen:

  1. Die Verbindungs-Wiederholungsschicht ist standardmäßig aktiviert: Solange connectRetryCount > 0 (der Standardwert 1) ist, wiederholt der Treiber die integrierte Fehlerliste für vorübergehende Verbindung.
  2. Die Anpassungsebene (Eigene retryExec und retryConn Regeln) ist standardmäßig deaktiviert. Beide Eigenschaften sind leere Zeichenfolgen, es sei denn, Sie legen sie fest. Sie können sie über die JDBC-URL, ein Properties-Objekt oder ein SQLServerDataSource-Objekt setzen. Der Fahrer entfernt die optionalen {...} Wrapper in allen drei Formen.

Java Codeausschnitte in diesem Artikel lassen Importe und Klassenwrapper aus Platzgründen weg.

In der JDBC-URL

Jede Regel (oder die gesamte Regelliste) muss in geschweifte Klammern gesetzt werden ({...}), da die JDBC-URL ; als Trennzeichen verwendet:

jdbc:sqlserver://server;databaseName=db;retryExec={1205,1222:3,2*2:select,update}
jdbc:sqlserver://server;databaseName=db;retryConn={+<customErrorNumber>}

Mit einem Properties-Objekt

Properties props = new Properties();
props.setProperty("user", "...");
props.setProperty("password", "...");
props.setProperty("retryExec", "1205,1222:3,2*2:select,update");
props.setProperty("retryConn", "+<customErrorNumber>");
Connection c = DriverManager.getConnection("jdbc:sqlserver://server;databaseName=db", props);

Mit SQLServerDataSource

Die gleichen Setter sind auf der ISQLServerDataSource Schnittstelle vorhanden:

SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("server");
ds.setDatabaseName("db");
ds.setRetryExec("1205,1222:3,2*2:select,update");
ds.setRetryConn("+<customErrorNumber>");

Syntax von Regeln

Eine einzelne Regel weist bis zu drei durch Doppelpunkt getrennte Abschnitte auf:

<errorNumbers> : <retryTimings> : <queryFilter>
Abschnitt Erforderlich? Bedeutung
errorNumbers Ja Eine SQL Server Fehlernummer oder mehrere durch Kommas getrennt (z. B1205. oder 1205,1222). Für Verbindungsregeln steuert ein optionales führendes +, ob die vorhandenen transienten Fehler beibehalten werden.
retryTimings Erforderlich für Anweisungsregeln . Weglassen für Verbindungsregeln. retryCount[,initialRetryTime[<op>retryChange]] wobei <op>+ (additiv) oder * (multiplikativ) ist.
queryFilter Nur optionale Anweisungsregeln Durch Trennzeichen getrennte Liste von SQL-Schlüsselwörtern. Der Treiber wandelt den Wert beim Parsen in Kleinbuchstaben um und wandelt die zuvor ausgeführte SQL-Anweisung zur Laufzeit in Kleinbuchstaben um. Die Regel wird ausgelöst, wenn die verknüpfte Filterliste das erste Token der ausgeführten SQL enthält. Lassen Sie den dritten Abschnitt aus, um die Filterung zu deaktivieren.

Wenn Sie mehrere Regeln in derselben Eigenschaft verwenden möchten, trennen Sie sie mit ; und umschließen Sie beim Einfügen in eine JDBC-URL jede Regel mit {...}.

Zeitparameter

Für eine Aussageregel mit Zeitangaben retryCount, initialRetryTime <op> retryChange:

  • retryCount: Die Anzahl der zusätzlichen Versuche, die der Treiber nach dem ersten Fehler vornimmt. Ein Wert von 0 deaktiviert die Wiederholung. Negative Werte sind ungültig.
  • initialRetryTime: Die Anzahl der Sekunden, die vor dem ersten Wiederholungsversuch gewartet werden soll. Der Standardwert ist 0.
  • <op>: Der Operator, der + oder * sein kann. Der Standardwert ist +.
  • retryChange: Der betrag, der zum Berechnen der nachfolgenden Wartezeiten angewendet wurde. Der Standardwert ist 2. Wenn der Operand * ist und retryChange in der Regel weggelassen wird, setzt der Treiber retryChange = initialRetryTime.

Important

Wenn Sie initialRetryTime ohne expliziten Operanden angeben (z. B. 3,5), verwendet der Treiber die Standardwerte für den Operanden und retryChange (+ und 2). Die Wartezeiten sind nicht konstant. Sie wachsen bei jedem Wiederholungsversuch um 2. Verwenden Sie zum Abrufen einer konstanten Wartezeit das explizite Formular retryCount,N+0 (z. B 3,5+0. ).

Der Treiber berechnet die Wartezeit für den Versuch i (nullbasiert) beim Parsen:

Operand Warten auf Versuch i
+ (additiv) initialRetryTime + (retryChange * i)
* (multiplikativ) initialRetryTime * (retryChange ^ i)

Beispiele für Zeitzeichenfolgen:

String retryCount initialRetryTime Operand retryChange Wartesequenz (Sekunden)
3 3 0 (Standard) + (Standardwert) 2 (Standard) 0, 2, 4
3,5 3 5 + (Standardwert) 2 (Standard) 5, 7, 9
3,5+5 3 5 + 5 5, 10, 15
3,2*2 3 2 * 2 2, 4, 8
4,1* 4 1 * 1 (entspricht initialRetryTime, da der Operand * ist und retryChange ausgelassen wird) 1, 1, 1, 1

Ein retryTimings Abschnitt kann höchstens ein Komma enthalten. Mehr als ein Komma führt zu R_invalidParameterNumber.

Wiederholungsregeln für Anweisungen (retryExec)

Anweisungsregeln wiederholen die Ausführung fehlgeschlagener Anweisungen. Wenn eine Anweisung eine(n) SQLServerException auslöst, führt der Treiber Folgendes aus:

  1. Sucht im Regelsatz der geparsten Anweisung nach der Fehlernummer, die den Fehler verursacht hat.
  2. Wenn eine Regel vorhanden ist und die aktuelle Anzahl der Versuche kleiner als retryCountist, überprüft optional die zuletzt ausgeführte SQL-Datei anhand der Regel queryFilter.
  3. Wenn alles übereinstimmt, wartet der Treiber waitTimes[retryAttempt] Sekunden (vorbehaltlich queryTimeout, siehe Wechselwirkung mit queryTimeout und connectRetryCount) und führt die Anweisung erneut aus.
  4. Wenn keine Regel übereinstimmt, gibt der Treiber die Ausnahme zurück.

Format (Anweisungen)

{errorNumber(s):retryCount[,initialRetryTime[<op>retryChange]][:queryFilter]}

Anweisungsregeln müssen einen Abschnitt für Zeitangaben enthalten. retryCount ist obligatorisch. Eine Regel, die nur eine Fehlernummer enthält, wird als Verbindungsregel interpretiert, sodass anweisungen immer mindestens retryCountangeben.

Beispiele (Aussagen)

Regel Auswirkung
{1205:3} Wiederholen Sie bei Deadlock-Opfer (1205) den Vorgang bis zu 3 Mal, ohne Wartezeit zwischen den Wiederholungsversuchen.
{1205,1222:3,5+5} Versuchen Sie das Deadlock-Opfer und das Sperrtimeout bis zu 3 Mal, warten Sie 5, 10 und 15 Sekunden.
{2714:2,1*2} Wiederholen Sie "Objekt ist bereits vorhanden" bis zu 2 Mal, und warten Sie 1 und 2 Sekunden.
{1205:4,2+2:select,update} Erneut versuchen Sie es nur, wenn die fehlerhafte Anweisung mit select oder update beginnt.
{1205:3,5+5};{1222:2,2} Zwei unabhängige Regeln, getrennt durch ;.

Das Auflisten mehrerer Fehlernummern (zum Beispiel 1205,1222) ist eine Kurzschreibweise. Der Treiber erweitert die Regel auf einen Eintrag pro Fehler, wobei alle die gleiche Anzeigedauer und denselben Abfragefilter verwenden.

Regeln für erneute Verbindungsversuche (retryConn)

Verbindungsregeln arbeiten mit der bestehenden Schleife für Verbindungswiederholungen zusammen. Diese Schleife ist nur aktiv, wenn connectRetryCount > 0 (der Standardwert ist 1). Die Schleife versucht bei einer integrierten Liste vorübergehender Verbindungsfehler bereits automatisch erneut, im Abstand von connectRetryInterval Sekunden, bis zu connectRetryCount weitere Male, und ist durch loginTimeout begrenzt.

Eine Verbindungsregel enthält nur einen Abschnitt mit Fehlernummern. Es gibt keine Zeitangaben oder Abfragefilter:

{[+]errorNumber(s)}
  • Ohne +, ersetzen die konfigurierten Regeln die integrierte vorübergehende Fehlerliste. Nur Fehler, die Sie auflisten, werden wiederholt.
  • Mit + (z. B {+4060}. ) werden die konfigurierten Regeln der integrierten Liste hinzugefügt . Sowohl Ihre Fehler als auch die Standardwerte des Treibers werden wiederholt.

Der Ersetzungs- oder Anfügemodus ist global für den gesamten retryConn Wert. Wenn in diesem Wert eine Regel + auslässt, schaltet der Treiber für alle in diesem Wert enthaltenen Regeln in den Ersetzungsmodus. Beispielsweise fügt retryConn={+4060};{40143} 4060 und 40143 der integrierten Liste nicht hinzu. Die Regel 40143 lässt + aus, sodass die integrierte Liste verworfen wird und nur 4060 und 40143 erneut versucht werden. Um beide anzuhängen, schreiben Sie retryConn={+4060};{+40143} (oder retryConn={+4060,40143}).

Die Verbindungsschleife verwendet weiterhin connectRetryInterval und connectRetryCount zur Taktung und Begrenzung. Die CRL-Regel erweitert oder ersetzt die Menge der Fehler, die für einen Wiederholungsversuch infrage kommen.

Beispiele (Verbindungen)

Regel Auswirkung
{+<customErrorNumber>} Fügen Sie der integrierten vorübergehenden Fehlerliste eine benutzerdefinierte Fehlernummer hinzu.
{+<customError1>,<customError2>} Fügen Sie der integrierten vorübergehenden Fehlerliste mehrere benutzerdefinierte Fehlernummern hinzu.
{4060} Wiederholen Sie nur den Fehler 4060. Integrierte vorübergehende Fehler werden von CRL nicht mehr erneut versucht.

Note

retryConn ändert loginTimeout die Semantik nicht. Die vorhandene Schleife für Verbindungswiederholungen begrenzt weiterhin die insgesamt verstrichene Zeit und bricht frühzeitig ab, wenn der nächste connectRetryInterval die verstrichene Zeit über loginTimeout hinaus erhöhen würde.

Integrierte Liste vorübergehender Verbindungsfehler

Die Verbindungs-Wiederholungsschleife wiederholt bereits die folgenden Fehler ohne CRL-Konfiguration, solange .connectRetryCount > 0 Die Auflistung eines dieser Fehler in einer retryConn-Regel mit + ist wirkungslos (da sie bereits abgedeckt sind). Verwenden Sie eine retryConn-Regel, wenn Sie einen Fehler hinzufügen müssen, der in dieser Liste nicht enthalten ist, oder wenn Sie die Liste vollständig verwerfen müssen, indem Sie das no-+-Ersetzen-Format verwenden.

Note

Sie müssen keine allgemeinen Azure SQL vorübergehenden Verbindungsfehler wie 40197, 40501, 40613, 49918, 49919 oder 49920 anfügen. Die integrierte Liste ruft sie bereits erneut auf.

Fehler Message Troubleshooting
64 Eine Verbindung mit dem Server wurde erfolgreich hergestellt, aber dann trat während des Anmeldevorgangs ein Fehler auf. (Anbieter: TCP-Anbieter, Fehler: 0 – Der angegebene Netzwerkname ist nicht mehr verfügbar.) Die TCP-Verbindung wurde während des Handshakes unterbrochen. Kein Anmeldefehler. Wenn das Problem weiterhin besteht, prüfen Sie, ob eine Netzwerkinstabilität auf Client-Seite, Fehler in den NIC-Offload-Funktionen oder ein zwischengeschaltetes Gerät vorliegen, das halb aufgebaute Verbindungen verwirft.
233 Der Client konnte aufgrund eines Fehlers während des Verbindungsinitialisierungsprozesses vor der Anmeldung keine Verbindung herstellen. Transport- oder TLS-Fehler vor der Anmeldung. Der Server gibt dies häufig zurück, wenn die Verbindung nicht akzeptiert werden kann (Ressourcenausschöpfung, maximale Verbindungen erreicht oder ein nicht unterstützter Client). Kein Anmeldefehler. Überprüfen Sie den Serverzustand, dann überprüfen Sie loginTimeout, die TLS-Einstellungen und die Kompatibilität der TLS-Versionen von Client und Server.
4060 Datenbank-database_name, die von der Anmeldung angefordert wurden, kann nicht geöffnet werden. Fehler bei der Anmeldung. Die Anmeldung wurde authentifiziert, konnte die angeforderte Datenbank aber nicht öffnen. Zu den vorübergehenden Ursachen gehört, dass sich die Datenbank in einem Übergangszustand befindet (Failover, Wiederherstellung, Hochskalierung) oder automatisch pausiert ist. Persistente Ursachen (Datenbank ist nicht vorhanden, Anmeldezugriff fehlt) werden nicht durch Wiederholung behoben. Überprüfen Sie den Datenbanknamen, die Anmeldezuordnung und den Datenbankstatus.
4221 Die Anmeldung bei read-secondary ist aufgrund einer langen Wartezeit auf HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING fehlgeschlagen. Die lesbare sekundäre Replik konnte die Anmeldung nicht annehmen, da für noch aktive Transaktionen noch Zeilenversionen fehlten, als die Replik neu gestartet wurde. Entschärfung durch Vermeidung von langen Schreibvorgängen auf die Primäre; Der Wiederholungsversuche ist in der Regel erfolgreich, sobald der primäre Commit ausgeführt wird oder die geöffneten Transaktionen zurückgesetzt werden.
10053 Beim Senden der Anfrage an den Server ist ein Fehler auf Transportebene aufgetreten. (Anbieter: TCP-Anbieter, Fehler: 0 – Eine hergestellte Verbindung wurde von der Software auf Ihrem Hostcomputer abgebrochen.) Die lokale Seite hat die Verbindung abgebrochen (Windows SocketsWSAECONNABORTED). Oft liegt die Ursache in einem Keepalive-Fehler oder darin, dass der lokale Netzwerkstapel eine inaktive oder halboffene Verbindung trennt. Überprüfen Sie den Zustand der clientseitigen Netzwerkverbindung, die Keepalive-Timer des Betriebssystems sowie jede lokale Firewall oder jeden VPN-Client.
10054 Beim Senden der Anfrage an den Server ist ein Fehler auf Transportebene aufgetreten. (Anbieter: TCP-Provider, Fehler: 0 – Eine vorhandene Verbindung wurde vom Remotehost zwangsweise geschlossen.) Die Gegenseite hat einen TCP-Reset gesendet (Windows Sockets WSAECONNRESET). Häufige Ursachen: der Peerprozess ist abgestürzt, eine Firewall hat ein Reset-Paket gesendet, oder das Azure SQL-Gateway hat eine inaktive Verbindung geschlossen. Aktivieren Sie für Idle-Reset-Muster tcp keepalive auf dem Client, oder kürzen Sie das Leerlauftimeout für den Verbindungspool.
10928 Ressourcen-ID: N. Der Grenzwert für die Datenbank ist N und wurde erreicht. Siehe sys.dm_exec_sessions für Informationen zur Verwendung. Das Limit für die Ressourcenverwaltung der Datenbank wurde erreicht (Sitzungen, Worker oder Anfragen). Ermitteln Sie anhand der Meldung die Art der Begrenzung und verringern Sie dann die Parallelität, skalieren Sie die Datenbank hoch oder verkürzen Sie lang andauernde Vorgänge, die die Ressource belegen.
10929 Ressourcen-ID: N. Die Mindestgarantie für den Grenzwerttyp ist N, maximaler Grenzwert ist N und die aktuelle Verwendung für die Datenbank ist N. Der Server ist zurzeit jedoch zu ausgelastet, um Anforderungen zu unterstützen, die größer als N für diese Datenbank sind. Die Datenbank überschreitet ihre Mindestgarantie, und der zugrunde liegende Server drosselt die Leistung. Der Wiederholungsvorgang ist in der Regel erfolgreich, wenn die Benachbarte Last fällt. Dauerhafte Vorkommen deuten darauf hin, dass Sie eine höhere Dienstebene oder eine weniger laute Umgebung benötigen.
40020
40143
40166
40540
Gemeldet im Error code %d-Slot von Fehler 40197 während des Failovers. In eine 40197-Failovermeldung eingebettete Untercodes, die auf einigen Pfaden als Fehlernummer auf oberster Ebene erscheinen. Der Treiber listet jede Form einzeln auf, sodass er es bei jeder der beiden Formen erneut versucht. Behandeln Sie sie genauso wie 40197.
40197 Dienstfehler beim Verarbeiten Ihrer Anforderung. Versuche es erneut. Fehlercode N. Ein Softwareupgrade, Hardwarefehler oder ein anderes Failoverereignis in Azure SQL. Durch erneutes Verbinden werden Sie zu einem fehlerfreien Replikat weitergeleitet. Der eingebettete Fehlercode identifiziert den Failovertyp. Wiederholt auftretende Probleme sollten mit der Sitzungsverfolgungs-ID gemeldet werden.
40501 Der Dienst ist derzeit ausgelastet. Wiederholen Sie die Anforderung in 10 Sekunden. Vorfall-ID: guid. Code: N. Drosselung der Azure SQL-Datenbank-Engine Die empfohlene Untergrenze für die Wartezeit beträgt 10 Sekunden. Eine anhaltende Drosselung weist darauf hin, dass Sie das DTU-/vCore-Kontingent überschritten haben; skalieren Sie hoch oder reduzieren Sie die Parallelität.
40613 Die Datenbank database_name auf dem Server server_name ist derzeit nicht verfügbar. Wiederholen Sie den Verbindungsversuch später. Wenn das Problem weiterhin besteht, wenden Sie sich an den Kundensupport, und stellen Sie die Sitzungsablaufverfolgungs-ID der GUID bereit. Die Datenbank ist nicht verfügbar, in der Regel mitten im Failover oder kurz während eines Skalierungsvorgangs. Versuchen Sie es nach einer Wartezeit erneut; wenn das Problem nach einigen Minuten weiterhin besteht, notieren Sie die Session-Trace-ID und eröffnen Sie einen Supportfall.
42108 Es kann keine Verbindung mit dem SQL-Pool hergestellt werden, da er angehalten wurde. Bitte reaktivieren Sie den SQL-Pool, und versuchen Sie es erneut. Der dedizierte SQL-Pool (Synapse) befindet sich in einem angehaltenen Zustand. „Erneut versuchen“ hilft nur, wenn etwas den Pool parallel wieder aufnimmt. Nehmen Sie den Pool explizit wieder auf, oder planen Sie den Workload nach der Wiederaufnahme.
42109 Der SQL-Pool wird aufgewärmt. Versuche es erneut. Der dedizierte SQL-Pool wird wieder aufgenommen. Wiederholen Sie den Vorgang auf einem Backoff, bis es online ist. Das Aufwärmen dauert in der Regel ein paar Minuten.
49918 Anforderung kann nicht verarbeitet werden. Zum Verarbeiten der Anforderung sind nicht genügend Ressourcen vorhanden. Die Steuerebene konnte zur zeit keine Ressourcen für die Anforderung zuordnen. Wiederholen Sie den Vorgang auf einem Backoff. Dauerhafte Vorkommen deuten auf regionalen Kapazitätsdruck hin.
49919 Die Anfrage zum Erstellen oder Aktualisieren kann nicht verarbeitet werden. Für das Abonnement N werden derzeit zu viele Erstellungs- oder Aktualisierungsvorgänge ausgeführt. Parallelitätsgrenze auf Abonnementebene bei Verwaltungsvorgängen. Reduzieren Sie parallele Erstellungs-/Aktualisierungsaufrufe oder führen Sie sie gestaffelt aus.
49920 Anforderung kann nicht verarbeitet werden. Zu viele Vorgänge in Bearbeitung für Abonnement N. Parallelitätsgrenzwert auf Abonnementebene für Vorgänge in Flight. Reduzieren Sie die Parallelität, oder warten Sie, bis die laufenden Vorgänge abgeschlossen sind.

Die kanonische Liste des Treibers ist die TransientError Enumeration in SQLServerError.java. Fehlermeldungstext stammt aus Azure SQL vorübergehenden Verbindungsfehlern. Fehler auf Anweisungsebene (z. B. Deadlock-Opfer 1205 oder Zeitüberschreitung der Sperranforderung 1222) stehen nicht in dieser Liste, da die Verbindungswiederholungsschleife nur beim initialen Verbindungsaufbau greift. Verwenden Sie eine retryExec Regel, um diese Fehler erneut zu versuchen.

Laden von Regeln aus einer Eigenschaftendatei

Wenn Sie auf der Verbindung retryExec oder retryConn nicht festlegen, sucht CRL auf dem Klassenpfad neben dem Treiber-JAR nach einer Datei namens mssql-jdbc.properties. Die Datei verwendet einfaches key=value Parsing. Zeilen, die mit retryExec= oder retryConn= beginnen, werden erfasst. Werte verwenden dieselbe Syntax, die in diesem Artikel beschrieben wird, und ; trennen mehrere Regeln.

Verwenden Sie genaue Schlüsselnamen (retryExec und retryConn), ohne führende Leerzeichen. Die Datei wird nicht als vollständige Java Eigenschaftendatei analysiert. Der Treiber prüft in jeder Zeile wörtlich auf startsWith, also:

  • Zeilen, die mit # oder einem anderen Präfix als retryExec/retryConn beginnen, werden ignoriert.
  • Zeilen, deren Schlüssel nur mit retryExec oder retryConn beginnen (zum Beispiel retryExec2=...), werden als entsprechende Eigenschaft behandelt und können Syntaxanalysefehler verursachen. Stellen Sie keine benutzerdefinierten Varianten vor.

Beispiel mssql-jdbc.properties:

retryExec=1205:3,5+5;1222:2,2
retryConn=+4060,40143

Wenn die Datei fehlt, protokolliert die CRL im Logger com.microsoft.sqlserver.jdbc.ConfigurableRetryLogic eine Meldung FINE und fährt ohne Regeln fort. Der für die Suche verwendete Dateipfad ist in dieser Protokollmeldung enthalten.

Die Werte der Verbindungszeichenfolge haben Vorrang. Wenn retryExec oder retryConn in der Verbindung nicht leer sind, zieht der Treiber für diese Eigenschaft die Datei nicht heran.

Regelaktualisierungsverhalten

CRL verwaltet einen einzelnen, JVM-weiten Regelsatz. Nach dem Bau aktualisiert der Fahrer die Regeln lazily:

  • Der Treiber bewertet Gelegenheiten zur Aktualisierung während der Ausführung der Anweisung und bei erneuten Verbindungsversuchen.
  • Eine Aktualisierung erfolgt tatsächlich erst, nachdem seit dem vorherigen Lesevorgang 30 Sekunden vergangen sind.
  • Wenn die Regeln ursprünglich von mssql-jdbc.properties kamen, vergleicht der Treiber den Zeitstempel der letzten Änderung der Datei mit dem Zeitstempel, den er beim vorherigen Lesen aufgezeichnet hat. Wenn sich die Datei geändert hat, analysiert der Treiber sie erneut.
  • Wenn die Regeln ursprünglich aus einem Verbindungszeichenfolge stammen, wendet der Treiber den zuvor gespeicherten Verbindungszeichenfolgenwert erneut an.

Dieses Verhalten bedeutet, dass Änderungen an mssql-jdbc.properties innerhalb von etwa 30 Sekunden automatisch erkannt werden, ohne die Anwendung neu zu starten.

Important

Da es sich bei dem Regelsatz um ein JVM-weites Singleton handelt, werden beim Öffnen einer zweiten Verbindung, die einen anderen Wert für retryExec oder retryConn festlegt, die Regeln für die erste Verbindung ebenfalls ersetzt. Behandeln Sie die CRL-Konfiguration als Einstellung auf Prozessebene, keine Einstellung pro Verbindung, wenn mehrere Verbindungen in demselben JVM nicht übereinstimmen.

Interaktion mit queryTimeout und connectRetryCount

Anweisungswiederholungen und queryTimeout

Wenn eine Anweisungsregel ausgelöst wird, vergleicht der Treiber die nächste Wartezeit mit dem Wert auf Verbindungsebene queryTimeout :

  • Wenn queryTimeout >= 0undtimeToWait > queryTimeout, löst der Treiber R_InvalidRetryInterval aus, anstatt es erneut zu versuchen. Der Treiber löst den ursprünglichen Fehler nicht erneut aus. Er löst den Konfigurationsfehler aus.
  • Die queryTimeout-Verbindungseigenschaft ist standardmäßig auf -1 gesetzt, sodass der Vergleich standardmäßig übersprungen wird und jede Wartezeit zulässig ist.
  • Die Einstellung queryTimeout=0 deaktiviert diese Überprüfung nicht , da 0 >= 0 "true" ist. Beliebige timeToWait > 0 erhöht R_InvalidRetryInterval.

Wenn Sie queryTimeout auf einen positiven Wert festlegen, halten Sie den initialRetryTime + (retryCount - 1) * retryChange-Wert (additiv) bzw. den initialRetryTime * retryChange^(retryCount-1)-Wert (multiplikativ) darunter.

Verbindungswiederholungen und connectRetryCount und loginTimeout

retryConn ermöglicht für sich genommen keine Wiederholungen der Authentifizierung. Die vorhandenen Eigenschaften bleiben zuständig:

  • connectRetryCount (Standard 1, Bereich 0-255) ist die Anzahl zusätzlicher Authentifizierungsversuche. Setzen Sie es auf 0, um Authentifizierungswiederholungen zu deaktivieren. retryConn hat keine Auswirkung, wenn connectRetryCount = 0der Treiber den ersten Fehler auslöst.
  • connectRetryInterval (Standard 10 Sekunden, Bereich 1-60) ist die Wartezeit zwischen versuchen. Der erste Wiederholungsversuch wird sofort ausgeführt.
  • loginTimeout ist die Gesamtschranke. Der Treiber bricht frühzeitig ab, wenn durch das nächste Intervall die verstrichene Zeit über loginTimeout steigen würde.

Weitere Informationen finden Sie unter Verbindungsresilienz (JDBC).

Beispiele

Überleben von Deadlocks und Sperrtimeouts für Schreibvorgänge

jdbc:sqlserver://server;databaseName=db;retryExec={1205,1222:4,2*2:insert,update,delete,merge}

Bis zu vier Wiederholungen für Deadlock-Opfer (1205) oder Sperrtimeout (1222), mit Backoff von 2, 4, 8 und 16 Sekunden, aber nur für Schreibanweisungen.

Schemaerstellung während des Onlinebetriebs erneut ausführen

retryExec={2714:2,1+1};{3702:2,1+1}

Wiederholt Fehler 2714 (object already exists) und 3702 (cannot drop database currently in use) jeweils zweimal mit Wartezeiten von 1 bzw. 2 Sekunden.

Hinzufügen eines benutzerdefinierten Fehlers zur Liste vorübergehender Fehler

retryConn={+<customErrorNumber>}

Fügt eine benutzerdefinierte Fehlernummer hinzu, die noch nicht in der integrierten Liste enthalten ist. Wenn Sie einen integrierten Azure SQL vorübergehenden Fehler anfügen, z. B. 40197, 40501, 40613, 49918, 49919 oder 49920, ändert sich nichts, da der Treiber dies bereits erneut anzeigt.

Konfigurieren von CRL über eine Eigenschaftendatei

Platzieren Sie mssql-jdbc.properties neben dem Treiber-JAR:

retryExec=1205:3,5+5:select,update
retryConn=+<customErrorNumber>

Legen Sie für die Verbindung nicht retryExec oder retryConn fest. Der Treiber liest die Regeln aus der Datei ein und liest sie nach jeder Änderung erneut ein (wird alle 30 Sekunden überprüft).

Problembehandlung bei CRL

Aktivieren FINE (oder feiner) Protokollierung beim com.microsoft.sqlserver.jdbc.ConfigurableRetryLogic Logger, um Dateileseversuche und Analyseentscheidungen anzuzeigen:

com.microsoft.sqlserver.jdbc.ConfigurableRetryLogic.level=FINE

Häufige Konfigurationsfehler:

Fehlermeldungsschlüssel Ursache
R_invalidParameterNumber Ein nicht numerisches Token wurde angezeigt, bei dem der Treiber eine Fehlernummer oder einen Timing-Parameter erwartet oder retryTimings mehrere Kommas enthielt.
R_InvalidRuleFormat Die Regel hatte mehr als 3 doppelpunktgetrennte Abschnitte.
R_InvalidRetryInterval Die für eine Regel berechnete Wartezeit überschreitet queryTimeout. Verkürzen Sie die Wartezeit oder erhöhen Sie sie auf queryTimeout.
R_PathInvalid oder R_URLInvalid Der Treiber konnte keinen Pfad auflösen, um nach mssql-jdbc.properties zu suchen.
R_errorReadingStream E/A-Fehler beim Lesen mssql-jdbc.properties.

Note

Der Text einer R_invalidParameterNumber Nachricht liest Die Parameternummer {0} ist ungültig, bei der es sich um dieselbe Ressourcenzeichenfolge handelt, die der Treiber für Prepared-Statement-Parameterbindungsfehler verwendet. Wenn CRL diesen Fehler ausgibt, ist der fehlerhafte Wert das Token Ihrer Wiederholungsregel (z. B. eine Fehlernummer oder ein Zeitelement, das nicht numerisch ist) und nicht ein PreparedStatement-Parameterindex.

Was zu prüfen ist, wenn eine Regel nicht ausgelöst wird:

  1. Die Ausnahme SQLServerError.getErrorNumber() stimmt tatsächlich mit der Zahl in Ihrer Regel überein. SQL Server können einige Fehler je nach Kontext (z. B. Deadlock vs. Sperrtimeout) in verschiedene Zahlen umschließen.
  2. Bei Statement-Regeln mit einem queryFilter befindet sich das erste durch Leerzeichen getrennte Token der ausgeführten SQL-Anweisung in Kleinbuchstaben in der Filterliste. Kommentare und WITH CTEs ändern das erste Token.
  3. retryCount Wiederholungsversuche sind zusätzliche Versuche. Die erste Ausführung zählt nicht.
  4. Bei Verbindungsregeln connectRetryCount ist es größer als 0 und loginTimeout lässt Platz für mindestens ein weiteres connectRetryInterval.
  5. Die Regel hat die richtige Form. Regeln für Anweisungen benötigen einen Abschnitt für Zeitangaben. Verbindungsregeln dürfen nicht.