Partilhar via


Conectar-se a um banco de dados SQL do Azure

Baixar driver JDBC

Este artigo discute problemas quando você usa o Microsoft JDBC Driver para SQL Server para se conectar a um Banco de Dados SQL do Azure. Para obter mais informações para se conectar a um Banco de Dados SQL do Azure, consulte:

Detalhes

Para se conectar a um Banco de Dados SQL do Azure, você deve se conectar ao banco de dados mestre para chamar SQLServerDatabaseMetaData.getCatalogs.
O Banco de Dados SQL do Azure não oferece suporte ao retorno de todo o conjunto de catálogos de um banco de dados de usuário. SQLServerDatabaseMetaData.getCatalogs usam a exibição sys.databases para obter os catálogos. Consulte a discussão sobre permissões em sys.databases (Transact-SQL) para entender o comportamento SQLServerDatabaseMetaData.getCatalogs em um Banco de Dados SQL do Azure.

Tempo limite de login

Ao se conectar aos bancos de dados SQL do Azure, o padrão loginTimeout recomendado é de 30 segundos. Se você estiver se conectando a uma instância sem servidor, é recomendável usar um período ainda maior loginTimeout de 60 segundos ou mais. Se a instância em ambiente serverless estiver ociosa, pode demorar algum tempo para ser ativada numa conexão inicial. Para obter mais informações sobre como definir o loginTimeout, consulte Definindo as propriedades da conexão.

Conexões interrompidas

Quando você se conecta a um Banco de Dados SQL do Azure, conexões ociosas podem ser encerradas por um componente de rede (como um firewall) após um período de inatividade. Existem dois tipos de conexões ociosas, neste contexto:

  • Inativo na camada TCP, onde as conexões podem ser descartadas por qualquer número de dispositivos de rede.

  • Inativo devido ao Gateway SQL do Azure, onde mensagens TCP keepalive podem estar a ocorrer (o que faz com que a conexão não seja considerada ociosa do ponto de vista TCP), mas não houve uma consulta ativa em 30 minutos. Nesse cenário, o gateway determinará que a conexão TDS está ociosa durante 30 minutos e então encerrará a conexão.

Para resolver o segundo ponto e evitar que o Gateway encerre conexões ociosas, você pode:

  • Use a política de conexãoRedirecionar para configurar sua fonte de dados SQL do Azure.

  • Mantenha as ligações ativas através de atividades leves. Este método não é recomendado e só deve ser usado se não houver outras opções possíveis.

Para resolver o primeiro ponto e evitar que um componente de rede derrube conexões ociosas, defina as seguintes configurações do Registo ou os seus equivalentes em sistemas não-Windows no sistema operativo onde o driver é carregado:

Observação

A partir da versão 10.2 do Microsoft JDBC Driver para SQL Server, o driver define automaticamente os seguintes valores keep alive nos soquetes que cria durante as conexões de banco de dados, substituindo os padrões do sistema operacional definidos na tabela a seguir. Essa configuração automática só é executada em versões do Java que suportam a configuração das opções de manutenção de vida do soquete. No Linux e macOS, as atualizações mais recentes do Java 8+ suportam essa configuração. No Windows, as atualizações mais recentes do Java 17+ suportam essa configuração.

Configuração do Registro Valor Recomendado
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

Reinicie o computador para que as configurações do Registro entrem em vigor.

Os valores KeepAliveTime e KeepAliveInterval estão em milissegundos. Essas configurações fazem com que uma conexão que não responde seja desconectada dentro de 10 a 40 segundos. Se nenhuma resposta for recebida depois que um pacote keep alive for enviado, ele será repetido a cada segundo até 10 vezes. Se nenhuma resposta for recebida durante esse tempo, o soquete do lado do cliente será desconectado. Dependendo do seu ambiente, talvez você queira aumentar o KeepAliveInterval para acomodar interrupções conhecidas (por exemplo, migrações de máquinas virtuais), que podem fazer com que um servidor pare de responder por mais de 10 segundos.

Observação

TcpMaxDataRetransmissions não é controlável no Windows Vista ou Windows 2008 e superior.

Para configurar isso em uma VM do Azure, crie uma tarefa de inicialização para adicionar as chaves do Registro. Por exemplo, adicione a seguinte tarefa de inicialização ao arquivo de definição de serviço:

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

Em seguida, adicione um arquivo AddKeepAlive.cmd ao seu projeto. Defina a configuração "Copiar para diretório de saída" como Copiar sempre. O script a seguir é um arquivo de AddKeepAlive.cmd de exemplo:

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  

Acrescentar o nome do servidor ao userId na cadeia de conexão

Antes da versão 4.0 do Microsoft JDBC Driver para SQL Server, para se conectar a um Banco de Dados SQL do Azure, era necessário acrescentar o nome do servidor ao UserId na cadeia de conexão. Por exemplo, user@servername. A partir da versão 4.0 do Microsoft JDBC Driver para SQL Server, não é mais necessário acrescentar @servername ao UserId na cadeia de conexão.

Usar a criptografia requer a configuração hostNameInCertificate

Antes da versão 7.2 do Microsoft JDBC Driver para SQL Server, para se conectar a uma base de dados SQL do Azure, especifique hostNameInCertificate se especificar encrypt=true (Se o nome do servidor na cadeia de conexão for shortName.domainName, defina a propriedade hostNameInCertificate como *.domainName.). Esta propriedade é opcional a partir da versão 7.2 do driver.

Por exemplo:

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

Consulte também

Conectando-se ao SQL Server com o driver JDBC