Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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:
- 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. - Il livello di personalizzazione (le tue regole
retryExeceretryConn) è disattivato per impostazione predefinita. Entrambe le proprietà sono stringhe vuote, a meno che non vengano impostate. È possibile impostarli tramite l'URL JDBC, unPropertiesoggetto o un oggettoSQLServerDataSource. 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 |
Sì | 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 valore0disabilita 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 è*eretryChangeviene omesso dalla regola, il driver impostaretryChange = 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:
- Cerca il numero di errore non riuscito nel set di regole dell'istruzione analizzata.
- Se esiste una regola e il numero corrente di tentativi è inferiore a
retryCount, verifica facoltativamente l'ultima istruzione SQL eseguita rispetto aqueryFilterdella regola. - Se tutto corrisponde, il driver attende
waitTimes[retryAttempt]secondi (soggetto aqueryTimeout, vedere Interazione con queryTimeout e connectRetryCount) ed esegue nuovamente l'istruzione. - 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/retryConnvengono ignorate. - Le righe la cui chiave inizia solo con
retryExecoretryConn(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 generaR_InvalidRetryIntervalinvece 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. OgnitimeToWait > 0sollevaR_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 su0per disabilitare i tentativi di autenticazione.retryConnnon ha alcun effetto quandoconnectRetryCount = 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 trascorsologinTimeout.
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:
- 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. - 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 eWITHCTE modificano il primo token. -
retryCounti nuovi tentativi sono tentativi aggiuntivi. La prima esecuzione non conta. - Per le regole di connessione,
connectRetryCountè maggiore di 0 eloginTimeoutlascia spazio per almeno un altroconnectRetryInterval. - La regola ha la forma corretta. Le regole delle istruzioni richiedono una sezione delle temporizzazioni. Le regole di connessione non devono essere.