Microsoft JDBC Driver para SQL Server

Baixar o JDBC Driver

O driver JDBC (Conectividade de Banco de Dados Microsoft Java) para SQL Server é um driver JDBC tipo 4 (Java puro, fala diretamente do protocolo TDS SQL Server, sem bibliotecas nativas necessárias) que permite que qualquer Java aplicativo ou servidor de aplicativos se conecte ao SQL Server, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure e banco de dados SQL no Microsoft Fabric. Ele implementa as APIs JDBC padrão e funciona com os principais servidores de aplicativos Java, incluindo IBM WebSphere e SAP NetWeaver.

Escolha o ponto de partida

Linha de base de produção para SQL do Azure

Use esse snippet como ponto de partida para uma conexão de SQL do Azure orientada à produção. O sistema carrega o nome do servidor e o nome do banco de dados da configuração do aplicativo, como as configurações do aplicativo do Serviço de Aplicativo do Azure, as variáveis de ambiente ou um arquivo de configuração, e define programaticamente o restante das propriedades da conexão. A configuração combina Transport Layer Security (TLS), identidade gerenciada, novas tentativas de conexão em falhas transitórias, recuperação rápida do grupo de failover, um tempo limite de login mais longo para cobrir um failover de inicialização a frio e lógica configurável de repetição (CRL) para instruções SQL que sofrem limitação no SQL do Azure ou failover no meio da consulta.

Para maior segurança e expansão mais fácil, mantenha as informações de conexão fora do código. Em produção, armazene informações de conexão no sistema de configuração do aplicativo e use Azure Key Vault para valores confidenciais e configurações de conexão gerenciadas centralmente. Para obter mais informações, consulte Proteção de cadeias de conexão.

Neste artigo, os trechos de código Java omitem importações e declarações de classe para fins de brevidade.

// Load endpoint details from application configuration. In Azure App Service,
// these can come from app settings or Key Vault-backed settings.
String serverName = System.getenv("SQL_SERVER_NAME");
String databaseName = System.getenv("SQL_DATABASE_NAME");
String port = System.getenv().getOrDefault("SQL_PORT", "1433");

if (serverName == null || databaseName == null) {
    throw new IllegalStateException(
            "Set SQL_SERVER_NAME and SQL_DATABASE_NAME in your application configuration.");
}

String url = "jdbc:sqlserver://" + serverName + ":" + port;

Properties props = new Properties();
props.setProperty("databaseName", databaseName);
props.setProperty("encrypt", "true");
props.setProperty("trustServerCertificate", "false");
props.setProperty("authentication", "ActiveDirectoryManagedIdentity");
props.setProperty("loginTimeout", "120");         // 90 is the minimum floor for this retry profile; 120 leaves practical failover margin
props.setProperty("connectRetryCount", "5");     // retry transient connection failures up to 5 times (default 1)
props.setProperty("connectRetryInterval", "15"); // 15 seconds between connection retries (default 10)
props.setProperty("multiSubnetFailover", "true"); // recommended for any Azure SQL HA listener
// props.setProperty("applicationIntent", "ReadOnly"); // uncomment to route to a readable secondary
// Retry deadlocks and lock timeouts, plus Azure SQL throttling and mid-query failover.
props.setProperty("retryExec", "1205,1222:3,5+5;40501,40613,40197,10928,10929,49918:4,5*2");

try (Connection conn = DriverManager.getConnection(url, props);
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery("SELECT 1")) {
    while (rs.next()) {
        System.out.println(rs.getInt(1));
    }
}

Este trecho de código foi ajustado para grupos de failover do Banco de Dados SQL do Azure e para o Instância Gerenciada de SQL do Azure.

Defina multiSubnetFailover=true somente quando você se conectar a um ouvinte de grupo de failover, ouvinte de grupo de disponibilidade ou ponto de extremidade da instância do cluster de failover. O uso dessa propriedade em relação a pontos de extremidade que não são ouvintes de alta disponibilidade (HA) pode prejudicar o desempenho e não tem suporte. Para obter mais informações, consulte o suporte ao driver JDBC para alta disponibilidade e recuperação de desastre.

O snippet não define retryConn porque o driver já faz novas tentativas automaticamente para os erros transitórios de conexão mais comuns do SQL do Azure (incluindo 4060, 40197, 40501, 40613, 49918, 49919, 49920, 10928 e 10929) por padrão, condicionado por connectRetryCount e connectRetryInterval. Para obter a lista completa, consulte a lista de erros de conexão transitória interna. Adicione retryConn com +<errorNumber> somente quando precisar estender a lista com um erro que ainda não esteja coberto, ou defina-o como <errorNumber> (sem + no início) para substituí-lo. Se você colocar o mesmo valor em uma URL JDBC, embrulhe-o como retryConn={+<errorNumber>} ou retryConn={<errorNumber>}.

A retryExec propriedade tem duas partes, escritas como rule1;rule2 quando você a define programaticamente. Se você inserir o mesmo valor em uma URL JDBC, coloque cada regra entre chaves, como em {rule1};{rule2}:

  • {1205,1222:3,5+5} tenta novamente três vezes em caso de vítimas de deadlock (1205) e tempos limite de solicitação de bloqueio (1222), com um recuo linear de 5, 10 e 15 segundos. Para 1205, SQL Server reverte a transação antes que o driver veja o erro, portanto, executar novamente uma única instrução é seguro. Se a instrução que entrou em deadlock fazia parte de uma transação com múltiplas instruções, as instruções anteriores também foram revertidas, e a CRL não as reexecuta; portanto, coloque toda a transação em seu próprio loop de nova tentativa. 1222 deixa a transação aberta, e a nova tentativa no nível da instrução apenas reexecuta a instrução dentro da transação original; se você também precisar limitar a duração da transação, coloque a transação inteira em seu próprio loop de nova tentativa.

  • {40501,40613,40197,10928,10929,49918:4,5*2} tenta novamente quatro vezes em caso de limitação de taxa do SQL do Azure, failover no meio da consulta e erros de limite de recursos, com um recuo exponencial de 5, 10, 20 e 40 segundos. Esses erros estão na lista interna de erros transitórios do loop connect, mas retryExec é quem os captura quando ocorrem no meio de uma consulta em uma conexão já estabelecida. Os intervalos de espera da CRL são limitados por queryTimeout. Se você definir queryTimeout abaixo da próxima espera planejada, o driver desiste antes e a relança. Escolha um queryTimeout que seja pelo menos tão grande quanto o total de esperas de CRL mais o runtime da instrução ou aceite que as retiradas mais longas não serão disparadas.

Para grupos de failover do Banco de Dados SQL do Azure, réplicas nomeadas do Hyperscale e scale-out de leitura, ou ouvintes de grupos de disponibilidade Always On, defina applicationIntent=ReadOnly quando quiser ser direcionado a uma réplica secundária legível. Para nuvens soberanas em que o SAN (Nome Alternativo do Assunto do certificado) não inclui o host ao qual você está se conectando, também defina hostNameInCertificate para corresponder a ele (por exemplo, *.database.usgovcloudapi.net para o Azure Governamental).

Para obter mais informações sobre cada parte dessa configuração, consulte:

Para o catálogo de erros transitórios do SQL do Azure, consulte Solucionar problemas de erros de conexão transitórios.

Características principais

  • JDBC baseado em padrões: driver tipo 4. O build do JRE 11+ implementa o JDBC 4.2, além dos métodos de limite de solicitação do JDBC 4.3 (beginRequest, endRequest) e dos auxiliares de aspas Statement. As APIs de sharding do JDBC 4.3 (setShardingKey, a família createConnectionBuilder) lançam SQLFeatureNotSupportedException. O build do JRE 8 implementa o JDBC 4.2. Para obter a divisão por versão e a lista completa de métodos 4.3 compatíveis e sem suporte, consulte Java e suporte à especificação JDBC.
  • Suporte à plataforma ampla: é executado em qualquer plataforma com uma JVM (Máquina Virtual) Java com suporte, incluindo Windows, Linux e macOS.
  • Criptografado por padrão: conexões criptografadas com TLS, com encrypt=true como padrão para drivers atuais.
  • Autenticação do Microsoft Entra ID: conexões sem senha com identidade gerenciada, entidade de serviço e fluxos interativo, integrado, de cadeia de credenciais padrão e de token de acesso.
  • Kerberos: autenticação integrada para Active Directory local.
  • NTLM: autenticação de desafio/resposta do Windows para cenários sem domínio ou herdados.
  • Always Encrypted: criptografia do lado do cliente para colunas sensíveis, com enclaves seguros opcionais para operações no local.
  • Cópia em massa: inserções de alto desempenho com a API SQLServerBulkCopy e desempenho de inserção em lote para executeBatch.
  • Resiliência da conexão: novas tentativas de conexão integradas para erros transitórios, além de lógica de repetição configurável e opcional para instruções (retryExec) e uma lista de erros de conexão personalizável (retryConn).
  • Amplo suporte a tipos de dados do SQL Server: datetimeoffset, sql_variant, JSON, dados espaciais, vetores, parâmetros com valor de tabela e tipos definidos pelo usuário.

Introdução

Artigo Description
Requisitos do sistema Suporte para versões de Java, sistema operacional e SQL Server.
Matriz de suporte Matriz de compatibilidade detalhada para versões de driver JDBC.
Baixar o Microsoft JDBC Driver para SQL Server Links para download, coordenadas do Maven e artefatos de lançamento.
Introdução ao JDBC Driver Instale o driver, configure seu ambiente e execute sua primeira consulta.
Visão geral do JDBC Driver Arquitetura, recursos com suporte e conformidade de especificação JDBC.

Configuração e conexão

Artigo Description
Conectando ao SQL Server com o JDBC Driver Abra uma conexão com uma instância de SQL Server de Java.
Conectando-se a um banco de dados SQL do Azure Conecte um aplicativo Java ao Banco de Dados SQL do Azure.
Construindo a URL de conexão Referência completa da sintaxe de URL e das propriedades de jdbc:sqlserver://.
Definir as propriedades de conexão Todas as propriedades de conexão, padrões e como defini-las.
Definindo as propriedades da fonte de dados Configure SQLServerDataSource para uso com servidores JNDI e aplicativos.
Trabalhando com uma conexão Abra, reutilize e feche as conexões corretamente.
Como usar o pool de conexões Fontes de dados JNDI e integração com pools externos.
Resiliência de conexão Tentativas de reconexão integradas e detecção de falha de conexão.
Lógica de repetição configurável Tente novamente instruções com falha com retryExec e personalize a lista de novas tentativas de conexão com retryConn.
Noções básicas sobre as propriedades de tempo limite no driver JDBC loginTimeout, queryTimeouttempos limite de soquete e como eles interagem.
Implantando o JDBC Driver Empacote e implante o driver com seu aplicativo.

Authenticate

Artigo Description
Autenticação do Microsoft Entra Identidade gerenciada, principal de serviço, autenticação interativa, autenticação integrada e autenticação por token de acesso.
Autenticação integrada kerberos Conecte-se com Kerberos e Active Directory.
Autenticação NTLM Use as credenciais NTLM para se autenticar.
Autenticação de certificado do cliente para cenários de loopback Autenticar clientes com certificados em conexões de loopback.

Secure

Artigo Description
Protegendo aplicativos do JDBC Driver Diretrizes de segurança para aplicativos Java que usam o driver.
Segurança de aplicativo Modelo de ameaça e recomendações detalhadas de defesa.
Proteger cadeias de conexão Mantenha as credenciais e as strings de conexão fora do código-fonte.
Configurando o cliente para criptografia Raízes de confiança, pinagem de certificado e configurações de TLS.
Conectando-se com criptografia Force encrypt=true e valide o certificado do servidor.
Noções básicas sobre suporte à criptografia Como o driver negocia o TLS com SQL Server.
Validar entrada de usuário Parametrize o SQL e evite a injeção.
Modo FIPS Execute o driver em ambientes em conformidade com FIPS.
Always Encrypted Configure a criptografia do lado do cliente para colunas confidenciais.
Always Encrypted com enclaves seguros Habilite operações avançadas em colunas criptografadas.
Referência da API Always Encrypted Superfície de API para provedores de criptografia de coluna e repositórios de chaves.

Trabalhar com dados

Artigo Description
Trabalhando com instruções e conjuntos de resultados Noções básicas de Statement, PreparedStatement e conjuntos de resultados.
Como usar instruções com o JDBC Driver Execute instruções parametrizadas e não parametrizadas.
Tratando instruções complexas Procedimentos armazenados, vários resultados e contagens de atualização.
Trabalhando com conjuntos de resultados Iterar, atualizar e rolar pelos resultados da consulta.
Como usar vários conjuntos de resultados Manipular consultas que retornam mais de um conjunto de resultados.
Noções básicas sobre tipos de cursor Cursores somente para frente, roláveis e atualizáveis.
Como usar parâmetros com valor de tabela Passe TABLE parâmetros para procedimentos armazenados.
Como usar cópia em massa com o JDBC Driver Inserções de alta taxa de transferência com SQLServerBulkCopy.
API de cópia em massa para inserção em lote Acelere executeBatch para INSERT cargas de trabalho.
Executando operações em lote Inserções, atualizações e exclusões em lote.

Tipos de dados

Artigo Description
Trabalhando com tipos de dados Mapeie os tipos Java para os tipos do SQL Server.
Noções básicas sobre os tipos de dados do driver JDBC Sistema de tipos de driver e mapeamentos JDBC.
Conversões de tipo de dados Conversões implícitas e explícitas entre Java e SQL Server.
Diferenças de tipo de dados Casos extremos ao mapear tipos ao atravessar a fronteira.
Tipo de dados JSON Armazenar e consultar colunas JSON.
Tipos de dados espaciais Use geometria e geografia de Java.
Tipo de dados de vetor Trabalhe com o tipo vector do SQL Server.
sql_variant Ler e gravar colunas sql_variant.
Tipos definidos pelo usuário Use tipos clr definidos pelo usuário de Java.
Suporte ao conjunto de caracteres nacionais Tratamento de Unicode e colunas nvarchar.
Recursos internacionais Considerações sobre localização, ordenação e globalização.

Transações e simultaneidade

Artigo Description
Executando transações commit, rollback e semântica de confirmação automática.
Noções básicas sobre transações Ciclo de vida da transação e práticas recomendadas.
Níveis de isolamento Instantâneo, leitura confirmada, serializável e outros.
Controle de concorrência Estratégias de concorrência otimistas e pessimistas.
Bloqueio em nível de linha Como SQL Server usa e libera bloqueios de linha.
Como usar pontos de salvamento Reversão parcial em uma transação.
Gerenciando o tamanho da transação Ajuste o escopo da transação para evitar bloqueios de longa duração.
Transações XA Confirmação em duas fases com SQLServerXADataSource.

Desempenho e confiabilidade

Artigo Description
Melhorando o desempenho e a confiabilidade Indexação, consulta e ajuste no nível do driver.
Cache de metadados de instruções preparadas Reutilize os planos de instrução preparados.
Desempenho do parâmetro de instrução preparada Tipagem de parâmetros e reutilização do plano de execução.
Buffer adaptável Transmita colunas grandes sem carregá-las inteiramente na memória.
Fechando os objetos quando não estão em uso Libere Statement, ResultSet e Connection recursos prontamente.
Alta disponibilidade e recuperação de desastre Ouvintes de grupo de disponibilidade e failover de várias sub-redes.
Espelhamento de banco de dados Use o driver com parceiros de espelhamento de banco de dados.

Diagnosticar e solucionar problemas

Artigo Description
Diagnosticando problemas com o JDBC Driver Rastreamento, registro em log e modos de falha comuns.
Solução de problemas de conectividade Erros de conexão, falhas no handshake do TLS e instâncias nomeadas.
Rastreamento da operação do driver Habilite o registro em log do JDK para o driver.
Registrador de desempenho e callback Capturar métricas de desempenho para cada instrução.
Log de eventos estendidos Correlacionar erros do cliente com eventos estendidos do lado do servidor.
Tratando erros SQLException, códigos de erro e dicas de repetição.
Artigo Description
Notas de lançamento Histórico de versões e novidades em cada versão.
Dependências de recursos Dependências opcionais para Entra ID, Kerberos, Always Encrypted e outros.
Conformidade do JDBC 4.3 Conformidade com a API JDBC 4.3.
Conformidade do JDBC 4.2 Conformidade com a API JDBC 4.2.
Conformidade do JDBC 4.1 Conformidade com a API JDBC 4.1.
Conformidade e legal Conformidade com especificações e licenciamento.
Referência de API do JDBC Driver Classes, interfaces, métodos e campos expostos pelo driver.
Aplicativos de exemplo do JDBC Driver Exemplos completos de código.
perguntas frequentes Perguntas frequentes.