Compartilhar via


Conectar-se a um banco de dados SQL do Azure

Baixar Driver JDBC

Este artigo aborda os problemas ocorridos no uso do Microsoft JDBC Driver para SQL Server para conexão com 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:

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=myPassword;encrypt=true;hostNameInCertificate=*.int.mscds.com;

Confira também

Conectando ao SQL Server com o JDBC Driver