Connettersi a un database SQL di Azure

Scaricare il driver JDBC

Questo articolo illustra i problemi relativi all'uso di Microsoft JDBC Driver per SQL Server per connettersi a un database SQL di Azure. Per altre informazioni sulla connessione a un database Azure SQL, vedere:

Dettagli

Per connettersi a Database SQL di Azure, è necessario connettersi al database master per chiamare SQLServerDatabaseMetaData.getCatalogs.
Database SQL di Azure non supporta la restituzione dell'intero set di cataloghi da un database utente. SQLServerDatabaseMetaData.getCatalogs usa la vista sys.databases per ottenere i cataloghi. Vedere la discussione relativa alle autorizzazioni in sys.databases (Transact-SQL) per informazioni sul comportamento di SQLServerDatabaseMetaData.getCatalogs in Database SQL di Azure.

Timeout accesso

Quando ci si connette ai database SQL di Azure, il valore predefinito consigliato per loginTimeout è 30 secondi. Se ci si connette a un'istanza serverless, è consigliabile usare un valore più alto di loginTimeout, almeno 60 secondi. Se l'istanza serverless è inattiva, potrebbe essere necessario del tempo per riattivare una connessione iniziale. Per altre informazioni su come impostare loginTimeout, vedere Impostazione delle proprietà di connessione.

Connessioni eliminate

Quando si ci connette a Database SQL di Azure, le connessioni inattive possono essere terminate da un componente di rete, ad esempio un firewall, dopo un periodo di inattività. In questo contesto esistono due tipi di inattività:

  • Inattività a livello TCP, in cui le connessioni possono essere eliminate da un certo numero di dispositivi di rete.

  • Inattività nel gateway Azure SQL, in cui potrebbero verificarsi messaggi TCP keepalive (rendendo la connessione non inattiva da una prospettiva TCP), ma in cui non è stata rilevata una query attiva da 30 minuti. In questo scenario il gateway determinerà che la connessione TDS è inattiva da 30 minuti e la terminerà.

Per risolvere il secondo punto ed evitare che il gateway interrompa le connessioni inattive, è possibile:

  • Usare i criteri di connessione di reindirizzamento per configurare l'origine dati di Azure SQL.

  • Mantenere attive le connessioni con attività leggere. Questo metodo non è consigliato e dovrà essere usato solo in mancanza di altre opzioni possibili.

Per risolvere il secondo punto ed evitare che un componente di rete elimini le connessioni inattive, è consigliabile configurare le impostazioni del Registro di sistema indicate di seguito, o le relative equivalenti non Windows, nel sistema operativo in cui viene caricato il driver:

Impostazione del Registro di sistema Valore consigliato
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\KeepAliveTime 30000
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\KeepAliveInterval 1000
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpMaxDataRetransmissions 10

Riavviare il computer per attivare le impostazioni del Registro di sistema.

I valori KeepAliveTime e KeepAliveInterval sono espressi in millisecondi. Queste impostazioni causano la disconnessione di una connessione che non risponde entro 10-40 secondi. Se dopo l'invio di un pacchetto keep-alive non si riceve risposta, l'invio verrà ritentato ogni secondo fino a 10 volte. Se in questo periodo di tempo non si riceve risposta, il socket sul lato client viene disconnesso. A seconda dell'ambiente, potrebbe essere necessario aumentare il valore di KeepAliveInterval per gestire le interferenze note, come le migrazioni di macchine virtuali, che potrebbero causare la mancata risposta da parte di un server per più di 10 secondi.

Nota

TcpMaxDataRetransmissions non è controllabile in Windows Vista o Windows 2008 e versioni successive.

Per configurare questa impostazione in una VM di Azure, creare un'attività di avvio e aggiungere le chiavi del Registro di sistema. Ad esempio, aggiungere l'attività di avvio al file di definizione del servizio:

<Startup>  
    <Task commandLine="AddKeepAlive.cmd" executionContext="elevated" taskType="simple">  
    </Task>  
</Startup>  

Successivamente, aggiungere il file AddKeepAlive.cmd al progetto in uso. Impostare l'impostazione "Copia nella directory di output" su Copia sempre. Lo script seguente è un esempio di file AddKeepAlive.cmd:

if exist keepalive.txt goto done  
time /t > keepalive.txt  
REM Workaround for JDBC keep alive on Azure SQL  
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveTime /t REG_DWORD /d 30000 >> keepalive.txt  
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveInterval /t REG_DWORD /d 1000 >> keepalive.txt  
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v TcpMaxDataRetransmissions /t REG_DWORD /d 10 >> keepalive.txt  
shutdown /r /t 1  
:done  

Aggiungere il nome del server all'ID utente nella stringa di connessione

Prima della versione 4.0 di Microsoft JDBC Driver per SQL Server, per connettersi a un database SQL di, era necessario aggiungere il nome del server all'ID utente nella stringa di connessione. Ad esempio, user@servername. A partire dalla versione 4.0 di Microsoft JDBC Driver per SQL Server, non è più necessario aggiungere @servername all'ID utente nella stringa di connessione.

Impostazione di hostNameInCertificate obbligatoria per l'uso della crittografia

Nelle versioni di Microsoft JDBC Driver per SQL Server precedenti alla 7.2, per connettersi a un database SQL di Azure è necessario specificare hostNameInCertificate se si specifica encrypt=true (se il nome server nella stringa di connessione è shortName.domainName, impostare la proprietà hostNameInCertificate su *.domainName). Questa proprietà è facoltativa a partire dalla versione 7.2 del driver.

Ad esempio:

jdbc:sqlserver://abcd.int.mscds.com;databaseName=myDatabase;user=myName;password=myPassword;encrypt=true;hostNameInCertificate=*.int.mscds.com;

Vedi anche

Connessione a SQL Server con il driver JDBC