Conectar-se a um banco de dados SQL do Azure

Baixar o JDBC Driver

Este artigo aborda os problemas ao usar 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, confira:

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 dá suporte ao retorno de todo o conjunto de catálogos em um banco de dados de usuário. SQLServerDatabaseMetaData.getCatalogs usa a exibição sys.databases para obter os catálogos. Para entender o comportamento do SQLServerDatabaseMetaData.getCatalogs em um Banco de Dados SQL do Azure, veja a discussão sobre permissões em sys.databases.

Tempo limite do logon

Quando você se conecta a bancos de dados SQL do Azure, o loginTimeout padrão de 30 segundos é um ponto de partida razoável. Para o Banco de Dados SQL do Azure sem servidor com pausa automática habilitada, aumente o tempo para que ele dê suporte a repetições de conexão do driver enquanto o banco de dados for retomado. Para obter mais informações, confira Conectar-se a um banco de dados sem servidor pausado automaticamente. Para definir loginTimeout, veja Definir as propriedades da conexão.

Conexões descartadas

Quando você se conecta a um Banco de Dados SQL do Azure, um componente de rede (como um firewall) pode encerrar conexões ociosas após um período de inatividade. Nesse contexto, existem dois tipos de conexões ociosas:

  • Inativas na camada TCP, onde as conexões podem ser derrubadas por diversos dispositivos de rede.

  • Ociosas pelo Gateway do SQL do Azure, no qual as mensagens keepalive do TCP podem ocorrer (o que torna a conexão não ociosa de uma perspectiva do TCP), mas sem uma consulta ativa em 30 minutos. Nesse cenário, o Gateway determinará que a conexão TDS está ociosa após 30 minutos e encerrará a conexão.

Para resolver o segundo ponto e evitar que o gateway encerre conexões ociosas, você poderá:

  • Usar a política de conexão de redirecionamento para configurar sua fonte de dados do SQL do Azure.

  • Manter as conexões ativas por meio de atividade leve. Esse método não é recomendado e só deverá ser usado se não houver outras opções possíveis.

Para abordar o primeiro ponto e evitar a remoção de conexões ociosas por um componente de rede, defina as seguintes configurações do Registro ou dos equivalentes em ambientes não Windows no sistema operacional no qual o driver foi carregado:

Observação

A partir da versão 10.2 do Microsoft JDBC Driver for SQL Server, o driver redefine automaticamente os seguintes valores de keep alive em soquetes criados 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 dão suporte à configuração das opções manter ativas o soquete. No Linux e no macOS, as atualizações mais recentes do Java 8+ dão suporte a essa configuração. No Windows, as atualizações mais recentes do Java 17+ dão suporte a essa configuração.

Configuração do Registro Valor recomendado
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Serviços \ Tcpip \ Parâmetros \ KeepAliveTime 30000
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Serviços \ Tcpip \ Parâmetros \ KeepAliveInterval 1000
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ TcpMaxDataRetransmissions 10

Reinicie o computador para que as configurações do Registro tenham efeito.

Os valores KeepAlivetime e KeepAliveInterval são em milissegundos. Essas configurações fazem com que uma conexão sem resposta se desconecte em 10 a 40 segundos. Se nenhuma resposta for recebida após um pacote keep alive ser enviado, haverá uma nova tentativa a cada segundo até um total de dez vezes. Se nenhuma resposta for recebida durante esse tempo, o soquete do lado do cliente será desconectado. Dependendo do seu ambiente, talvez seja conveniente aumentar o KeepAliveInterval para acomodar as interrupções conhecidas (por exemplo, migrações de máquina virtual) que podem fazer com que um servidor não responda por mais de dez segundos.

Observação

O TcpMaxDataRetransmissions não é controlável no Windows Vista ou no 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 tarefa de inicialização abaixo ao arquivo de definição de serviço:

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

Depois, adicione um arquivo AddKeepAlive.cmd ao seu projeto. Defina a configuração "Copiar para Diretório de Saída" para Copiar sempre. O seguinte script é um exemplo de arquivo 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  

Anexar o nome do servidor ao userId na string 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 à UserId na cadeia de conexão. Por exemplo, usuário@nomedoservidor. A partir da versão 4.0 do Microsoft JDBC Driver para SQL Server, não é mais necessário acrescentar @servername à ID de usuário na cadeia de conexão.

Uso de criptografia requer a configuração de hostNameInCertificate

Com uma versão do Microsoft JDBC Driver para SQL Server anterior à 7.2, para se conectar a um Banco de Dados SQL do Azure, você deverá especificar hostNameInCertificate caso encrypt=true esteja especificado (se o nome do servidor na cadeia de conexão for shortName.domainName, defina a propriedade hostNameInCertificate como *.domainName.). Essa propriedade é opcional da versão 7.2 do driver em diante.

Por exemplo:

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