Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här artikeln beskriver problem när du använder Microsoft JDBC-drivrutinen för SQL Server för att ansluta till en Azure SQL Database. Mer information om hur du ansluter till en Azure SQL Database finns i:
Detaljer
Om du vill ansluta till en Azure SQL Database bör du ansluta till huvuddatabasen för att anropa SQLServerDatabaseMetaData.getCatalogs.
Azure SQL Database har inte stöd för att returnera hela uppsättningen kataloger från en användardatabas.
SQLServerDatabaseMetaData.getCatalogs använder sys.databases-vyn för att hämta katalogerna. Läs om behörigheter i sys.databases (Transact-SQL) för att förstå SQLServerDatabaseMetaData.getCatalogs-beteende i en Azure SQL Database.
Tidsgräns för inloggning
När du ansluter till Azure SQL-databaser är den rekommenderade standardinställningen loginTimeout 30 sekunder. Om du ansluter till en serverlös instans rekommenderar vi att du använder en ännu längre loginTimeout tid på 60 sekunder eller mer. Om den serverlösa instansen har varit inaktiv kan det ta lite tid för den att vakna vid en inledande anslutning. Mer information om hur du anger loginTimeoutfinns i Ange anslutningsegenskaper.
Anslutningar har tagits bort
När du ansluter till en Azure SQL Database kan inaktiva anslutningar avslutas av en nätverkskomponent (till exempel en brandvägg) efter en period av inaktivitet. Det finns två typer av inaktiva anslutningar i den här kontexten:
Inaktiv i TCP-lagret, där anslutningar kan tas bort av valfritt antal nätverksenheter.
Inaktiv av Azure SQL Gateway, där TCP keepalive-meddelanden kan förekomma (vilket gör att anslutningen inte är inaktiv från ett TCP-perspektiv), men inte hade en aktiv fråga på 30 minuter. I det här scenariot fastställer gatewayen att TDS-anslutningen är inaktiv i 30 minuter och avslutar anslutningen.
Om du vill åtgärda den andra punkten och undvika att gatewayen avslutar inaktiva anslutningar kan du:
Använd omdirigeringsanslutningsprincipen för att konfigurera din Azure SQL-datakälla.
Håll anslutningarna aktiva via lättviktsaktivitet. Den här metoden rekommenderas inte och bör endast användas om det inte finns några andra möjliga alternativ.
För att åtgärda den första punkten och undvika att släppa inaktiva anslutningar av en nätverkskomponent anger du följande registerinställningar eller deras motsvarigheter som inte är Windows i operativsystemet där drivrutinen läses in:
Anmärkning
Från och med version 10.2 av Microsoft JDBC-drivrutinen för SQL Server anger drivrutinen automatiskt följande keep alive-värden på socketar som skapas under databasanslutningar, vilket åsidosätter standardinställningarna för operativsystemet som definieras i följande tabell. Den här automatiska inställningen utförs endast på versioner av Java som stöder inställning av socket keep alive-alternativ. I Linux och macOS stöder de senaste uppdateringarna av Java 8+ den här inställningen. I Windows stöder de senaste uppdateringarna av Java 17+ den här inställningen.
| Registerinställning | Rekommenderat värde |
|---|---|
| HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ KeepAliveTime | 30000 |
| HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ KeepAliveInterval | 1 000 |
| HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ TcpMaxDataRetransmissions | 10 |
Starta om datorn för att registerinställningarna ska börja gälla.
Värdena KeepAliveTime och KeepAliveInterval finns i millisekunder. De här inställningarna gör att en anslutning som inte svarar kopplas från inom 10 till 40 sekunder. Om inget svar tas emot efter att ett keep alive-paket har skickats görs ett nytt försök varje sekund upp till 10 gånger. Om inget svar tas emot under den tiden kopplas klientsidans socket från. Beroende på din miljö kanske du vill öka KeepAliveInterval för att hantera kända störningar (till exempel migreringar av virtuella datorer) som kan leda till att en server inte svarar i mer än 10 sekunder.
Anmärkning
TcpMaxDataRetransmissions kan inte styras i Windows Vista eller Windows 2008 och senare.
Om du vill konfigurera detta på en virtuell Azure-dator skapar du en startuppgift för att lägga till registernycklarna. Lägg till exempel till följande startuppgift i tjänstdefinitionsfilen:
<Startup>
<Task commandLine="AddKeepAlive.cmd" executionContext="elevated" taskType="simple">
</Task>
</Startup>
Lägg sedan till en AddKeepAlive.cmd fil i projektet. Ange inställningen "Kopiera till utdatakatalog" till Kopiera alltid. Följande skript är ett exempel AddKeepAlive.cmd fil:
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
Lägg till servernamnet i userId i anslutningssträngen
Innan 4.0-versionen av Microsoft JDBC-drivrutinen för SQL Server, för att ansluta till en Azure SQL Database, var du skyldig att lägga till servernamnet till UserId i anslutningssträngen. Till exempel user@servername. Från och med version 4.0 av Microsoft JDBC-drivrutinen för SQL Server behöver du inte längre lägga @servername till UserId i anslutningssträngen.
Användning av kryptering kräver inställning av hostNameInCertificate
Innan 7.2-versionen av Microsoft JDBC-drivrutinen för SQL Server ska du för att ansluta till en Azure SQL Database ange hostNameInCertificate om du anger encrypt=true (Om servernamnet i anslutningssträngen är shortName.domainName anger du egenskapen hostNameInCertificate till *. domainName.). Den här egenskapen är valfri från och med version 7.2 av drivrutinen.
Till exempel:
jdbc:sqlserver://abcd.int.mscds.com;databaseName=myDatabase;user=myName;password=<password>;encrypt=true;hostNameInCertificate=*.int.mscds.com;