Logica di ripetizione dei tentativi configurabile (JDBC)

Scaricare il driver JDBC

La logica di ripetizione configurabile (CRL) è un meccanismo basato su regole che ripete automaticamente le istruzioni non riuscite o i tentativi iniziali di connessione in base ai numeri di errore di SQL Server selezionati, con parametri di temporizzazione controllati dall’utente. CRL è stato introdotto in Microsoft JDBC Driver 12.10 per SQL Server.

CRL è separato dalla resilienza delle connessioni inattive e dalle proprietà connectRetryCount / connectRetryInterval. La resilienza inattiva recupera in modo trasparente le connessioni interrotte e connectRetryCount ritenta l'autenticazione iniziale in base a una pianificazione fissa per un elenco predefinito di errori temporanei. CRL consente di decidere quali errori sono riprovabili, quante volte e per quanto tempo attendere tra i tentativi. È possibile usare insieme tutti e tre i meccanismi.

Tentativi CRL

CRL gestisce due scenari distinti, ognuno controllato dalla propria proprietà di connessione:

Scenario Property Quando viene eseguito il nuovo tentativo Attivati da
Errore durante l'esecuzione dell'istruzione retryExec Durante l'esecuzione di un'istruzione (ad esempio, executeQuery, executeUpdateexecute, o esecuzione batch) Un SQLServerException il cui numero di errore corrisponde a una regola dell'istruzione configurata
Errore di connessione o autenticazione iniziale retryConn All'interno del ciclo di tentativo di connessione e riconnessione del driver (controllato da connectRetryCount e loginTimeout) Un SQLServerException che si verifica durante l'autenticazione e il cui numero di errore corrisponde a una regola di connessione configurata oppure, per impostazione predefinita, qualsiasi errore transitorio già incluso nell'elenco interno dei tentativi

Nel caso delle istruzioni, il driver ritenta solo il comando non riuscito. Il driver non reimposta lo stato corrente della transazione, quindi è opportuno progettare le regole tenendo conto degli errori che lasciano la sessione utilizzabile, ad esempio vittima del deadlock (1205) o timeout di lock (1222).

Per le connessioni, CRL aumenta o sostituisce l'elenco predefinito del driver di errori di connessione temporanei. Vedere Regole di ripetizione dei tentativi di connessione per la semantica del + prefisso.

Abilitare CRL

CRL ha due livelli:

  1. Il livello di ripetizione dei tentativi di connessione è attivo per impostazione predefinita: purché connectRetryCount > 0 (il valore predefinito sia 1), il driver ritenta l'elenco degli errori di connessione temporanei predefiniti.
  2. Il livello di personalizzazione (le tue regole retryExec e retryConn) è disattivato per impostazione predefinita. Entrambe le proprietà sono stringhe vuote, a meno che non vengano impostate. È possibile impostarli tramite l'URL JDBC, un Properties oggetto o un oggetto SQLServerDataSource. Il driver rimuove gli involucri facoltativi {...} in tutte e tre le forme.

I frammenti di codice Java in questo articolo omettono le istruzioni import e le dichiarazioni di classe per brevità.

Nell'URL JDBC

Ogni regola (o l'intero elenco di regole) deve essere racchiusa tra parentesi graffe ({...}) perché l'URL JDBC usa ; come separatore:

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

Con un oggetto Properties

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);

Con SQLServerDataSource

Gli stessi setter esistono nell'interfaccia ISQLServerDataSource :

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

Sintassi delle regole

Una singola regola è composta da un massimo di tre sezioni separate da due punti:

<errorNumbers> : <retryTimings> : <queryFilter>
Sezione Obbligatorio? Meaning
errorNumbers Un numero di errore SQL Server o più separati da virgole (ad esempio, 1205 o 1205,1222). Per le regole di connessione, un elemento iniziale + facoltativo controlla se gli errori temporanei esistenti vengono mantenuti.
retryTimings Obbligatorio per le regole di istruzione . Omettere per le regole di connessione. retryCount[,initialRetryTime[<op>retryChange]] dove <op> è + (additivi) o * (moltiplicativo).
queryFilter Solo regole di istruzione facoltative Elenco delimitato da virgole di parole chiave SQL. Il driver minuscola il valore in fase di analisi e minuscole il codice SQL eseguito in precedenza in fase di esecuzione. La regola viene attivata quando l'elenco di filtri uniti contiene il primo token dell'istanza di SQL eseguita. Omettere la terza sezione per disabilitare il filtro.

Per usare più regole nella stessa proprietà, separarle con ; e racchiudere ogni regola con {...} quando le si inserisce in un URL JDBC.

Parametri di temporizzazione

Per una regola di istruzione con intervalli retryCount, initialRetryTime <op> retryChange:

  • retryCount: numero di tentativi aggiuntivi eseguiti dal driver dopo il primo errore. Il valore 0 disabilita la ripetizione dei tentativi. I valori negativi non sono validi.
  • initialRetryTime: numero di secondi di attesa prima del primo tentativo. Il valore predefinito è 0.
  • <op>: operatore, che può essere + o *. Il valore predefinito è +.
  • retryChange: quantità applicata al calcolo dei tempi di attesa successivi. Il valore predefinito è 2. Quando l'operando è * e retryChange viene omesso dalla regola, il driver imposta retryChange = initialRetryTime.

Importante

Se si specifica initialRetryTime senza un operando esplicito (ad esempio, 3,5), il driver usa i valori predefiniti per l'operando e (retryChange e +2). Le attese non sono costanti. Crescono di 2 ogni tentativo. Per ottenere un'attesa costante, usare il modulo retryCount,N+0 esplicito , ad esempio 3,5+0.

Il driver calcola il tempo di attesa per il tentativo i (basato su 0) in fase di analisi:

Operand Attendi il tentativo i
+ (additivo) initialRetryTime + (retryChange * i)
* (moltiplicativo) initialRetryTime * (retryChange ^ i)

Esempi di stringhe temporali:

Stringa retryCount initialRetryTime operando Riprova modifica Sequenza di attesa (secondi)
3 3 0 (predefinito) + (impostazione predefinita) 2 (impostazione predefinita) 0, 2, 4
3,5 3 5 + (impostazione predefinita) 2 (impostazione predefinita) 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 (uguale a initialRetryTime perché l'operando è * e retryChange viene omesso) 1, 1, 1, 1

Una retryTimings sezione può contenere al massimo una virgola. Più di una virgola genera R_invalidParameterNumber.

Regole di ripetizione dei tentativi di istruzione (retryExec)

Le regole delle istruzioni riprovano a eseguire un'istruzione non riuscita. Quando un'istruzione genera un SQLServerException, il driver:

  1. Cerca il numero di errore non riuscito nel set di regole dell'istruzione analizzata.
  2. Se esiste una regola e il numero corrente di tentativi è inferiore a retryCount, verifica facoltativamente l'ultima istruzione SQL eseguita rispetto a queryFilter della regola.
  3. Se tutto corrisponde, il driver attende waitTimes[retryAttempt] secondi (soggetto a queryTimeout, vedere Interazione con queryTimeout e connectRetryCount) ed esegue nuovamente l'istruzione.
  4. Se nessuna regola corrisponde, il driver rilancia l'eccezione.

Formato (istruzioni)

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

Le istruzioni devono includere una sezione delle temporizzazioni. retryCount è obbligatorio. Una regola che contiene solo un numero di errore viene interpretata come regola di connessione , quindi per le istruzioni specificano sempre almeno retryCount.

Esempi (istruzioni)

Rule Effetto
{1205:3} Ritentare in caso di vittima di deadlock (1205) fino a 3 volte, senza attesa tra un tentativo e l'altro.
{1205,1222:3,5+5} Ripetere il deadlock victim e il timeout di blocco fino a 3 volte, in attesa di 5, 10 e 15 secondi.
{2714:2,1*2} Riprovare "l'oggetto esiste già" fino a 2 volte, in attesa di 1 e 2 secondi.
{1205:4,2+2:select,update} Riprovare solo quando l'istruzione non riuscita inizia con select o update.
{1205:3,5+5};{1222:2,2} Due regole indipendenti, separate da ;.

L'elenco di diversi numeri di errore (ad esempio, 1205,1222) è una forma abbreviata. Il driver espande la regola in una voce per ciascun errore, con tutte le voci che condividono la stessa temporizzazione e lo stesso filtro della query.

Regole di ripetizione dei tentativi di connessione (retryConn)

Le regole di connessione funzionano con il ciclo di ripetizione dei tentativi di connessione esistente. Questo ciclo è attivo solo quando connectRetryCount > 0 il valore predefinito è 1. Il ciclo ripete già i tentativi per una serie predefinita di errori di connessione transitori a intervalli di connectRetryInterval secondi, fino a un massimo di connectRetryCount tentativi aggiuntivi, con un limite definito da loginTimeout.

Una regola di connessione fornisce solo una sezione relativa al numero di errore. Non ha tempistiche né filtro di query:

{[+]errorNumber(s)}
  • Senza +, le regole configurate sostituiscono l'elenco di errori temporanei predefiniti. Vengono ritentati solo gli errori elencati.
  • Con + (ad esempio, {+4060}), le regole configurate vengono aggiunte all'elenco predefinito. Vengono ritentati sia gli errori che i valori predefiniti del driver.

La modalità di sostituzione o aggiunta è globale per l'intero valore retryConn. Se una regola in tale valore omette +, il driver passa alla modalità di sostituzione per tutte le regole in tale valore. Ad esempio, retryConn={+4060};{40143} non aggiunge 4060 e 40143 all'elenco predefinito. La 40143 regola omette +, quindi l'elenco predefinito viene eliminato e vengono ritentati solo 4060 e 40143. Per accodare entrambi, scrivere retryConn={+4060};{+40143} (o retryConn={+4060,40143}).

Il ciclo di connessione continua a usare connectRetryInterval e connectRetryCount per la temporizzazione e la delimitazione. La regola CRL espande o sostituisce il set di errori idonei per la ripetizione dei tentativi.

Esempi (connessioni)

Rule Effetto
{+<customErrorNumber>} Aggiungere un numero di errore personalizzato all'elenco di errori temporanei predefinito.
{+<customError1>,<customError2>} Aggiungere più numeri di errore personalizzati all'elenco di errori temporanei predefinito.
{4060} Riprova solo per l'errore 4060. Gli errori temporanei predefiniti non vengono più ritentati da CRL.

Note

retryConn non modifica loginTimeout la semantica. Il ciclo esistente di ripetizione dei tentativi di connessione continua a limitare il tempo totale trascorso e si interrompe anticipatamente se il successivo connectRetryInterval farebbe superare al tempo trascorso loginTimeout.

Elenco di errori di connessione temporanei predefiniti

Il ciclo connect-retry ritenta già gli errori seguenti senza alcuna configurazione CRL, purché connectRetryCount > 0. Elencare uno di questi errori in una retryConn regola con + è un no-op (sono già coperti). Usa una retryConn regola quando devi aggiungere un errore che non è presente in questo elenco, oppure quando devi rimuovere del tutto l'elenco usando la forma no-+ replace.

Note

Non è necessario aggiungere errori di connessione comuni Azure SQL temporanei, ad esempio 40197, 40501, 40613, 49918, 49919 o 49920. L'elenco predefinito li ritenta già.

Error Message Troubleshooting
64 È stata stabilita una connessione con il server, ma si è verificato un errore durante il processo di accesso. (provider: provider TCP, errore: 0 - Il nome di rete specificato non è più disponibile. La connessione TCP si è interrotta durante la fase di handshake. Non si è verificato un errore di credenziale. Se il problema persiste, controlla l'eventuale instabilità della rete lato client, bug di offload della scheda di rete (NIC) o un dispositivo intermedio che interrompe le connessioni parzialmente stabilite.
233 Il client non è riuscito a stabilire una connessione a causa di un errore durante il processo di inizializzazione della connessione prima dell'accesso. Errore di trasporto o TLS prima dell'accesso. Il server restituisce in genere questo risultato quando non può accettare la connessione (esaurimento delle risorse, numero massimo di connessioni raggiunto o client non supportato). Non si è verificato un errore di credenziale. Verificare l'integrità del server, quindi controllare loginTimeout, le impostazioni TLS e la compatibilità della versione TLS client/server.
4060 Impossibile aprire il database database_name richiesto dall'account di accesso. Accesso non riuscito. L'accesso è stato autenticato, ma non è stato possibile aprire il database richiesto. Le cause transitorie includono il fatto che il database sia in fase di transizione (failover, ripristino, scalabilità verticale) o messo automaticamente in pausa. Le cause persistenti (il database non esiste, il login non dispone delle autorizzazioni necessarie) non si risolvono riprovando; verificate il nome del database, il mapping del login e lo stato del database.
4221 Accesso a read-secondary non riuscito a causa di un tempo di attesa troppo lungo su HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING. Il database secondario leggibile non ha potuto accettare l'accesso perché nelle transazioni in corso mancavano ancora versioni di riga quando la replica è stata riavviata. Per mitigare il problema, evitare transazioni di scrittura di lunga durata sul primario; il ritentativo in genere riesce una volta che il primario esegue il commit o il rollback delle transazioni aperte.
10053 Si è verificato un errore a livello di trasporto durante l'invio della richiesta al server. (provider: Provider TCP, errore: 0 - Una connessione stabilita è stata interrotta dal software sul computer host.) Il lato locale ha interrotto la connessione (Windows Sockets WSAECONNABORTED). Spesso si tratta di un errore del keepalive o dell'interruzione da parte dello stack di rete locale di una connessione inattiva o semiaperta. Controllare l'integrità della rete lato client, i timer keepalive del sistema operativo e qualsiasi firewall locale o client VPN.
10054 Si è verificato un errore a livello di trasporto durante l'invio della richiesta al server. (provider: provider TCP, errore: 0 - Una connessione esistente è stata chiusa forzatamente dall'host remoto. La parte remota ha inviato un reset TCP (Windows Sockets WSAECONNRESET). Cause comuni: il processo peer si è arrestato in modo anomalo, un firewall ha inserito una reimpostazione o il gateway Azure SQL ha chiuso una connessione inattiva. Per gli schemi di reset dovuti all'inattività, abilitare il keepalive TCP sul client o ridurre il timeout di inattività del pool di connessioni.
10928 ID risorsa: N. Il limite di tipo limite per il database è N ed è stato raggiunto. Vedere sys.dm_exec_sessions per informazioni sull'utilizzo. È stato raggiunto un limite di governance delle risorse nel database (sessioni, ruoli di lavoro o richieste). Identificare il tipo di limite dal messaggio, quindi ridurre la concorrenza, aumentare le prestazioni del database o abbreviare le operazioni a esecuzione prolungata che contengono la risorsa.
10929 ID risorsa: N. La garanzia minima di tipo limite è N, il limite massimo è N e l'utilizzo corrente per il database è N. Tuttavia, il server è attualmente troppo occupato per supportare le richieste maggiori di N per questo database. Il database sta superando la soglia minima garantita e il server sottostante sta limitando le prestazioni. La ripetizione dei tentativi ha in genere esito positivo quando il carico adiacente scende. Le occorrenze sostenute indicano che è necessario un livello di servizio superiore o un ambiente meno rumoroso.
40020
40143
40166
40540
Segnalato nel slot Error code %d dell'errore 40197 durante il failover. Sottocodici incorporati in un messaggio di failover 40197 che alcuni percorsi espongono come codice di errore di livello superiore. Il driver elenca ognuno singolarmente in modo che venga eseguito un nuovo tentativo in entrambi i moduli. Trattarli come 40197.
40197 Il servizio ha rilevato un errore durante l'elaborazione della richiesta. Riprova. Codice di errore N. Un aggiornamento software, un errore hardware o un altro evento di failover in Azure SQL. La riconnessione ti indirizza a una replica integra. Il codice di errore incorporato identifica il tipo di failover. Le occorrenze persistenti devono essere segnalate con l'ID di traccia della sessione.
40501 Il servizio è attualmente occupato. Ripetere la richiesta dopo 10 secondi. ID incidente: guid. Codice: N. Limitazione del motore di Azure SQL Il valore minimo consigliato per il backoff è di 10 secondi. La limitazione prolungata indica che è stato superato il limite DTU/vCore; aumentare le risorse o ridurre la concorrenza.
40613 Il database database_name sul server server_name non è attualmente disponibile. Eseguire nuovamente la connessione in un secondo momento. Se il problema persiste, contattare il supporto tecnico e specificare l'ID di traccia della sessione del GUID. Il database non è disponibile, in genere durante un failover o per breve tempo durante un'operazione di scalabilità. Riprovare dopo un intervallo di attesa; se il problema persiste per più di qualche minuto, annotare l'ID di tracciamento della sessione e aprire un caso di supporto.
42108 Impossibile connettersi al pool SQL perché è in pausa. Riprendere il pool SQL e riprovare. Il pool SQL dedicato (Synapse) si trova in uno stato sospeso. Ritentare è utile solo se qualcosa riattiva il pool in parallelo. Riprendere il pool in modo esplicito o pianificare il carico di lavoro dopo la ripresa.
42109 Il pool SQL si sta scaldando. Riprova. Il pool SQL dedicato riprende. Riprovare su un backoff fino a quando non è online; il riscaldamento richiede in genere alcuni minuti.
49918 Impossibile elaborare una richiesta. Risorse insufficienti per elaborare la richiesta. Al momento il piano di controllo non è riuscito ad allocare risorse per la richiesta. Riprova dopo un intervallo di attesa. Le occorrenze persistenti indicano una pressione della capacità a livello di area.
49919 Impossibile elaborare la richiesta di creazione o aggiornamento. Troppe operazioni di creazione o aggiornamento in corso per la sottoscrizione N. Limite di concorrenza a livello di sottoscrizione per le operazioni di gestione. Ridurre le chiamate parallele di creazione o aggiornamento oppure scaglionarle.
49920 Impossibile elaborare una richiesta. Troppe operazioni in corso per l'abbonamento N. Limite di concorrenza a livello di sottoscrizione per le operazioni in corso. Ridurre il parallelismo o attendere che le operazioni in corso vengano completate.

L'elenco canonico del driver è TransientError enum in SQLServerError.java. Il testo del messaggio di errore proviene da Azure SQL errori di connessione temporanei. Gli errori a livello di istruzione (ad esempio deadlock victim 1205 o lock-request timeout 1222) non sono inclusi in questo elenco, perché il ciclo connect-retry viene attivato solo durante la connessione iniziale. Per ritentare tali errori, usare una retryExec regola.

Caricare regole da un file di proprietà

Se non si imposta retryExec o retryConn nella connessione, CRL cerca un file denominato mssql-jdbc.properties accanto al file JAR del driver nel classpath. Il file usa il parsing di base key=value. Linee che iniziano con retryExec= o retryConn= vengono prelevate. I valori usano la stessa sintassi descritta in questo articolo, con ; la separazione di più regole.

Usare nomi di chiave esatti (retryExec e retryConn), senza spazi vuoti iniziali. Il file non viene analizzato come file di proprietà completo Java. Il driver esegue un controllo letterale startsWith su ogni riga, quindi:

  • Le righe che iniziano con # o qualsiasi altro prefisso non-retryExec/retryConn vengono ignorate.
  • Le righe la cui chiave inizia solo con retryExec o retryConn (ad esempio, retryExec2=...) vengono considerate come la proprietà corrispondente e possono generare errori di analisi. Non introdurre varianti personalizzate.

Esempio mssql-jdbc.properties:

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

Se il file è mancante, CRL registra un FINE messaggio nel com.microsoft.sqlserver.jdbc.ConfigurableRetryLogic logger e continua senza regole. Il percorso del file usato per la ricerca è incluso nel messaggio di log.

I valori della stringa di connessione hanno la precedenza. Se retryExec o retryConn non sono vuoti sulla connessione, il driver non consulta il file per quella proprietà.

Comportamento di aggiornamento delle regole

CRL gestisce un unico insieme di regole valido per l’intera JVM. Dopo la costruzione, il driver aggiorna le regole solo quando necessario:

  • Il driver valuta le possibilità di aggiornamento durante l'esecuzione dell'istruzione e durante i tentativi di riconnessione.
  • Un aggiornamento viene effettivamente eseguito solo dopo 30 secondi trascorsi dalla lettura precedente.
  • Se le regole provengono originariamente da mssql-jdbc.properties, il driver confronta il timestamp dell'ultima modifica del file con il timestamp registrato nella lettura precedente. Se il file è stato modificato, il driver lo analizza nuovamente.
  • Se le regole provengono originariamente da un stringa di connessione, il driver riapplica il valore della stringa di connessione archiviato in precedenza.

Questo comportamento significa che le modifiche apportate a mssql-jdbc.properties vengono prelevate automaticamente entro circa 30 secondi senza riavviare l'applicazione.

Importante

Poiché il set di regole è un singleton a livello dell’intera JVM, l’apertura di una seconda connessione che imposta un valore retryExec o retryConn diverso sostituisce anche le regole della prima connessione. Considerare la configurazione CRL come impostazione a livello di processo, non un'impostazione per connessione, quando più connessioni nella stessa JVM non sono d'accordo.

Interazione con queryTimeout e connectRetryCount

Nuovi tentativi di istruzione e queryTimeout

Quando si attiva una regola di statement, il driver confronta il tempo di attesa successivo con il valore queryTimeout a livello di connessione:

  • Se queryTimeout >= 0etimeToWait > queryTimeout, il driver genera R_InvalidRetryInterval invece di riprovare. Il driver non rigenera l'errore originale. Genera l'errore di configurazione.
  • La proprietà di connessione queryTimeout è impostata per impostazione predefinita su -1, quindi per impostazione predefinita il confronto viene ignorato ed è consentita qualunque attesa.
  • L'impostazione queryTimeout=0non disabilita questo controllo, perché 0 >= 0 è true. Ogni timeToWait > 0 solleva R_InvalidRetryInterval.

Quando si imposta queryTimeout su un valore positivo, mantenere il valore di initialRetryTime + (retryCount - 1) * retryChange (additivo) o di initialRetryTime * retryChange^(retryCount-1) (moltiplicativo) inferiore a tale valore.

Tentativi di connessione e connectRetryCount e loginTimeout

retryConn non abilita per sé i tentativi di autenticazione. Le impostazioni esistenti restano in vigore:

  • connectRetryCount (valore predefinito 1, intervallo 0-255) è il numero di tentativi di autenticazione aggiuntivi. Impostarlo su 0 per disabilitare i tentativi di autenticazione. retryConn non ha alcun effetto quando connectRetryCount = 0, perché il driver genera il primo errore.
  • connectRetryInterval (valore predefinito 10 secondi, intervallo da 1 a 60) è l'attesa tra i tentativi. Il primo tentativo viene eseguito immediatamente.
  • loginTimeout è il limite complessivo. Il driver rinuncia in anticipo se l'intervallo successivo farebbe superare al tempo trascorso loginTimeout.

Per altre informazioni, vedere Resilienza della connessione (JDBC).

Examples

Gestire i deadlock e i timeout di lock durante le operazioni di scrittura

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

Fino a quattro nuovi tentativi in caso di vittima di deadlock (1205) o timeout di lock (1222), con intervalli di attesa progressivi di 2, 4, 8 e 16 secondi, ma solo per le istruzioni di scrittura.

Rieseguire la creazione dello schema nelle operazioni online

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

Ritenta l'errore 2714 (object already exists) e 3702 (cannot drop database currently in use) due volte ciascuno, con 1 e 2 secondi di attesa.

Aggiungere un errore personalizzato all'elenco degli errori temporanei

retryConn={+<customErrorNumber>}

Aggiunge un numero di errore personalizzato non già incluso nell'elenco predefinito. Se si aggiunge un errore predefinito Azure SQL temporaneo, ad esempio 40197, 40501, 40613, 49918, 49919 o 49920, nulla cambia perché il driver lo ritenta già.

Configurare CRL tramite un file di proprietà

Posizionare mssql-jdbc.properties accanto al file JAR del driver:

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

Non impostare retryExec o retryConn sulla connessione. Il driver legge le regole dal file e rilettura dopo ogni modifica (controllata una volta ogni 30 secondi).

Risolvere i problemi di CRL

Attiva il logging FINE (o più dettagliato) sul logger com.microsoft.sqlserver.jdbc.ConfigurableRetryLogic per visualizzare i tentativi di lettura dei file e le decisioni di parsing:

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

Errori di configurazione comuni:

Chiave del messaggio di errore Motivo
R_invalidParameterNumber Viene visualizzato un token non numerico in cui il driver ha previsto un numero di errore o un parametro di intervallo oppure retryTimings contiene più di una virgola.
R_InvalidRuleFormat La regola conteneva più di 3 sezioni separate da due punti.
R_InvalidRetryInterval Il tempo di attesa calcolato di una regola di istruzione supera queryTimeout. Ridurre l'attesa o aumentare queryTimeout.
R_PathInvalid oppure R_URLInvalid Il driver non è riuscito a determinare un percorso in cui cercare mssql-jdbc.properties.
R_errorReadingStream Errore di I/O durante la lettura di mssql-jdbc.properties.

Note

Il testo di un R_invalidParameterNumber messaggio legge Il numero {0} di parametro non è valido, ovvero la stessa stringa di risorsa usata dal driver per gli errori di associazione di parametri dell'istruzione preparata. Quando viene generata da CRL, il valore che causa l'errore è il token della regola di ripetizione dei tentativi (ad esempio, un numero di errore o un elemento di intervallo non numerico), non un PreparedStatement indice di parametro.

Elementi da controllare quando una regola non viene attivata:

  1. L'eccezione SQLServerError.getErrorNumber() corrisponde effettivamente al numero nella regola. SQL Server può ricondurre alcuni errori a numeri diversi a seconda del contesto, ad esempio deadlock o timeout di blocco.
  2. Per le regole di istruzione con , queryFilteril primo token delimitato da spazi vuoti del codice SQL eseguito (in minuscolo) si trova nell'elenco di filtri. Commenti e WITH CTE modificano il primo token.
  3. retryCount i nuovi tentativi sono tentativi aggiuntivi. La prima esecuzione non conta.
  4. Per le regole di connessione, connectRetryCount è maggiore di 0 e loginTimeout lascia spazio per almeno un altro connectRetryInterval.
  5. La regola ha la forma corretta. Le regole delle istruzioni richiedono una sezione delle temporizzazioni. Le regole di connessione non devono essere.