Gli sviluppatori continuano a cercare il punto in cui una stringa di connessione, un URL JDBC o una voce di tnsnames.ora seleziona la VPN. Quel punto non esiste. Il tunnel è stabilito dal sistema operativo o da un client del fornitore che registra una scheda di rete virtuale, e ogni libreria di database sopra usa lo strato socket che ne deriva. Una stringa di connessione nomina un host, una porta e una credenziale, e questo è tutto il vocabolario.

Mito: la stringa di connessione può selezionare un tunnel

Il driver apre un socket TCP verso un host e una porta. Non ha API per sollevare un tunnel, nessun campo per un profilo di tunnel e nessun modo per autenticarsi a un gateway VPN.

Per questo gli strumenti si comportano allo stesso modo quando esiste una rotta. SSMS, DBeaver, Eclipse Data Tools e un semplice sqlcmd agiscono come se il server fosse sulla rete locale, perché dal punto di vista del socket lo è. La scheda virtuale ha reso raggiungibile la sottorete del database, e il driver non sa mai come.

Spiega anche perché una stringa di connessione non può riparare un tunnel caduto. Quando il collegamento muore, il driver segnala un timeout o un errore di rete generico, e il codice applicativo che lo tratta come un problema di query ritenta per sempre lo strato sbagliato.

Solleva il tunnel prima che il driver venga eseguito

Connetti la VPN a livello di sistema operativo, seguendo le istruzioni del fornitore o del team di rete, e solo dopo apri lo strumento. In pratica ciò significa che esiste una rotta verso la sottorete del database prima che il driver risolva il nome host.

Tieni la supervisione del tunnel fuori dall'applicazione. Un servizio PHP o Java che tenta di sollevare da solo il collegamento codifica il comportamento di un fornitore nel codice di business, e ogni failover diventa un rilascio dell'applicazione. Un supervisore che possiede il tunnel, lo sorveglia e lo riavvia è una questione separata dal percorso della query.

Controlla la rotta prima di dare la colpa al driver: se l'host non si risolve o la porta non risponde dalla shell, nessuna stringa di connessione cambierà questo.

Mito: un errore di autenticazione Windows significa che la rotta è rotta

L'autenticazione Windows attraverso una VPN fallisce spesso con un errore che sembra un guasto di rete, e la rotta è a posto. Quando l'account appartiene a un altro dominio e il portatile non può unirsi a esso, avvia il client con credenziali esplicite invece dell'identità della sessione desktop.

runas /noprofile /netonly /user:CORP\dbreader "C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\Ssms.exe"

L'opzione /netonly conserva quelle credenziali solo per l'autenticazione remota. Verifica ciò che il server ha realmente ricevuto con SELECT SUSER_SNAME() invece di fidarti della finestra di connessione. È riportato che salvare la credenziale per l'indirizzo del server in Windows Credential Manager funzioni per SSMS ma non sempre per un servizio eseguito con un altro account, quindi controlla quale identità usa il processo prima di cambiare il login.

La latenza trasforma un cursore lato server in un timeout

Un cursore lato server chiede al database di trattenere il risultato e recuperarlo in modo incrementale, il che trasforma un grande risultato in molti piccoli viaggi di andata e ritorno. In una LAN è economico. Attraverso un tunnel con decine di millisecondi di latenza aggiunta, la stessa query può superare il timeout del comando senza trasferire quasi nulla.

Passa a un cursore lato client, oppure aumenta la dimensione di recupero e raggruppa le righe, e il numero di viaggi diminuisce. Il collo di bottiglia è il numero di scambi, non la velocità nominale del collegamento, quindi misurare il throughput ti ingannerà mentre misurare i viaggi no. Prova con il set di risultati più grande che i tuoi utenti estraggono davvero, non con una query di una riga che torna subito. Se il timeout si sposta ma non scompare, aumenta insieme il timeout del comando e la dimensione di recupero e misura di nuovo.

La stessa aritmetica vale per gli ORM chiacchieroni e per qualsiasi client che emette un'istruzione per riga. Se il piano di query è buono e il trasferimento è piccolo, conta gli scambi di rete prima di ottimizzare il database.

Controlla la porta, l'istanza e il filtro locale

Un'istanza con nome ascolta su una porta dinamica, quindi verifica la porta invece di presumere 1433. In un'istanza predefinita il valore si legge dal valore di registro TcpPort sotto la chiave SuperSocketNetLib dell'istanza. Per Oracle, verifica che l'host in tnsnames.ora si risolva, che l'indirizzo risponda e che la porta del listener sia consentita; 1521 è un valore predefinito comune, non una garanzia.

Poi escludi la lista di accesso del tunnel stesso e, infine, un antivirus locale o un firewall host che blocca la connessione anche quando client e server sono la stessa macchina. Registra la fase che fallisce prima di cambiare la configurazione, perché risoluzione dei nomi, raggiungibilità TCP e TLS o login falliscono ciascuno con un messaggio diverso.

Scrivi la fase nel ticket. Altrimenti la persona successiva ripeterà la stessa ricerca della stringa di connessione da cui è iniziato tutto.

Articoli correlati