Compartilhar via


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. Confira a discussão sobre permissões em sys.databases (Transact-SQL) para entender o comportamento do SQLServerDatabaseMetaData.getCatalogs em um Banco de Dados SQL do Azure.

Tempo limite do logon

Ao se conectar a 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 loginTimeout ainda mais longo, de 60 segundos ou mais. Se a instância sem servidor estiver ociosa, poderá levar algum tempo para ativar uma conexão inicial. Para obter mais informações sobre como configurar o loginTimeout, confira Configurando as propriedades de conexão.

Conexões descartadas

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

  • Ociosas na camada TCP, onde as conexões podem ser removidas por qualquer número de 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 determina se a conexão TDS está ociosa em 30 minutos e a termina.

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 \ 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 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  

Acrescentar o nome do servidor à 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 à 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;

Confira também

Conectando ao SQL Server com o JDBC Driver