Microsoft JDBC Driver para SQL Server

Descargar controlador JDBC

El controlador de conectividad de base de datos (JDBC) de Microsoft Java para SQL Server es un controlador JDBC de tipo 4 (Java puro, habla directamente el protocolo TDS de SQL Server, no se requiere ninguna biblioteca nativa) que permita que cualquier aplicación o servidor de aplicaciones Java se conecte a SQL Server, Azure SQL Database, Azure SQL Managed Instance y SQL Database en Microsoft Fabric. Implementa las API de JDBC estándar y funciona con servidores de aplicaciones de Java importantes, como IBM WebSphere y SAP NetWeaver.

Elija el punto de partida.

Línea base de producción para Azure SQL

Use este fragmento de código como punto de partida para una conexión Azure SQL orientada a producción. Carga el nombre del servidor y el nombre de la base de datos a partir de la configuración de la aplicación, como la configuración de aplicaciones de Azure App Service, las variables de entorno o un archivo de configuración, y establece mediante programación el resto de las propiedades de conexión. La configuración combina Seguridad de la capa de transporte (TLS), identidad administrada, reintentos de conexión ante errores transitorios, recuperación rápida del grupo de conmutación por error, un tiempo de espera de inicio de sesión más largo para cubrir una conmutación por error tras un arranque en frío y lógica de reintento configurable (CRL) para instrucciones que se ven afectadas por la limitación de Azure SQL o por una conmutación por error a mitad de consulta.

Para una mayor seguridad y escalabilidad horizontal más sencilla, mantenga la información de conexión fuera del código. En producción, almacene la información de conexión en el sistema de configuración de la aplicación y use Azure Key Vault para los valores confidenciales y la configuración de conexión administrada centralmente. Para obtener más información, consulte Protección de cadenas de conexión.

Los fragmentos de código de Java de este artículo omiten las importaciones y los contenedores de clases para mayor brevedad.

// 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 fragmento de código está optimizado para los grupos de conmutación por error de Azure SQL Database y Azure SQL Managed Instance.

Establezca multiSubnetFailover=true solo cuando se conecte a un agente de escucha de grupo de conmutación por error, un agente de escucha de grupo de disponibilidad o un punto de conexión de instancia de clúster de conmutación por error. Usar esta propiedad con puntos de conexión que no sean listeners de alta disponibilidad (HA) puede perjudicar el rendimiento y no es compatible. Para obtener más información, consulte Compatibilidad del controlador JDBC con alta disponibilidad y recuperación ante desastres.

El fragmento de código no configura retryConn porque el controlador ya reintenta de forma predeterminada los errores transitorios de conexión más comunes de Azure SQL (incluidos 4060, 40197, 40501, 40613, 49918, 49919, 49920, 10928 y 10929), condicionado por connectRetryCount y connectRetryInterval. Para obtener la lista completa, consulte Lista de errores de conexión transitorios integrados. Añada retryConn con +<errorNumber> solo cuando necesite ampliar la lista con un error que no esté ya contemplado, o establézcalo en <errorNumber> (sin + al principio) para reemplazarlo. Si coloca el mismo valor en una dirección URL de JDBC, encapsula como retryConn={+<errorNumber>} o retryConn={<errorNumber>}.

La retryExec propiedad tiene dos partes, escritas como rule1;rule2 cuando se establece mediante programación. Si coloca el mismo valor en una dirección URL de JDBC, encapsula cada regla entre llaves como {rule1};{rule2}:

  • {1205,1222:3,5+5} vuelve a intentar tres veces las víctimas de interbloqueo (1205) y los tiempos de espera de las solicitudes de bloqueo (1222), con una espera lineal de 5, 10 y 15 segundos. Para 1205, SQL Server revierte la transacción antes de que el controlador vea el error, por lo que volver a ejecutar una sola instrucción es segura. Si la sentencia que provocó el interbloqueo formaba parte de una transacción de varias sentencias, las sentencias anteriores también se revirtieron y CRL no las vuelve a ejecutar, así que envuelve toda la transacción en tu propio bucle de reintento. 1222 mantiene abierta la transacción y el reintento a nivel de instrucción solo vuelve a ejecutar la instrucción dentro de la transacción original; si también necesita limitar la duración de la transacción, encapsule toda la transacción en su propio bucle de reintento.

  • {40501,40613,40197,10928,10929,49918:4,5*2} reintenta cuatro veces los errores de limitación de Azure SQL, de conmutación por error en mitad de la consulta y de límite de recursos, con intervalos de espera exponenciales de 5, 10, 20 y 40 segundos. Estos errores están en la lista integrada de errores transitorios del bucle connect, pero retryExec es quien los detecta cuando se producen en mitad de una consulta en una conexión ya establecida. Los intervalos de espera de CRL están acotados por queryTimeout. Si estableces queryTimeout por debajo de la siguiente espera prevista, el controlador desiste antes de tiempo y vuelve a lanzar la excepción. Elija un queryTimeout que sea como mínimo tan grande como el total de sus esperas de CRL más el tiempo de ejecución de la instrucción, o acepte que los mayores intervalos de espera no se activarán.

Para los grupos de conmutación por error de Azure SQL Database, las réplicas con nombre hiperescala y el escalado horizontal de lectura o los agentes de escucha del grupo de disponibilidad AlwaysOn, establezca applicationIntent=ReadOnly cuando quiera llegar a una base de datos secundaria legible. En el caso de las nubes soberanas en las que el Nombre alternativo del sujeto (SAN) del certificado no incluye el host al que se va a conectar, establezca también hostNameInCertificate para que coincida con él (por ejemplo, *.database.usgovcloudapi.net para Azure Government).

Para obtener más información sobre cada parte de esta configuración, consulte:

Para consultar el catálogo de errores transitorios de Azure SQL, consulte Solucionar errores transitorios de conexión.

Características clave

  • JDBC basado en estándares: controlador de tipo 4. La compilación para JRE 11+ implementa JDBC 4.2, además de los métodos de delimitación de solicitudes de JDBC 4.3 (beginRequest, endRequest) y las utilidades de comillas Statement. Las API de fragmentación de JDBC 4.3 (setShardingKey, la familia createConnectionBuilder) lanzan SQLFeatureNotSupportedException. La compilación JRE 8 implementa JDBC 4.2. Para obtener el desglose por versión y la lista completa de métodos compatibles y no compatibles 4.3, consulte compatibilidad con la especificación Java y JDBC.
  • Compatibilidad con plataformas amplias: se ejecuta en cualquier plataforma con una máquina virtual (JVM) compatible con Java, incluidos Windows, Linux y macOS.
  • Cifrado de forma predeterminada: conexiones cifradas con TLS con encrypt=true como valor predeterminado para los controladores actuales.
  • Autenticación de Microsoft Entra ID: conexiones sin contraseña con identidad administrada, principal de servicio, autenticación interactiva, autenticación integrada, cadena de credenciales predeterminada y flujos de token de acceso.
  • Kerberos: autenticación integrada para Active Directory local.
  • NTLM: Autenticación de desafío/respuesta de Windows para escenarios sin dominio o heredados.
  • Always Encrypted: cifrado del lado cliente para columnas confidenciales, con enclaves seguros opcionales para operaciones en contexto.
  • Copia en bloque: inserciones de alto rendimiento con la API SQLServerBulkCopy y rendimiento en la inserción por lotes para executeBatch.
  • Resiliencia de conexión: reintentos de conexión integrados para errores transitorios, además de lógica de reintento configurable y opcional para sentencias (retryExec) y una lista personalizable de errores de conexión (retryConn).
  • Compatibilidad con tipos de datos de SQL Server enriquecidos: datetimeoffset, sql_variant, JSON, espacial, vector, parámetros con valores de tabla y tipos definidos por el usuario.

Empieza ahora

Artículo Description
Requisitos del sistema Versiones de Java, sistema operativo y SQL Server compatibles.
Matriz de compatibilidad Matriz de compatibilidad detallada para las versiones del controlador JDBC.
Descarga de Microsoft JDBC Driver para SQL Server Enlaces de descarga, coordenadas de Maven y artefactos de la versión.
Introducción al controlador JDBC Instale el controlador, configure el entorno y ejecute la primera consulta.
Introducción al controlador JDBC Arquitectura, características admitidas y cumplimiento de la especificación JDBC.

Configuración y conexión

Artículo Description
Conexión a SQL Server con el controlador JDBC Abra una conexión a una instancia de SQL Server desde Java.
Conectarse a una instancia de Azure SQL Database Conecte una aplicación de Java a Azure SQL Database.
Creación de la dirección URL de conexión Referencia completa de la sintaxis y las propiedades de la URL jdbc:sqlserver://.
Establecimiento de las propiedades de conexión Todas las propiedades de conexión, los valores predeterminados y cómo establecerlas.
Establecimiento de las propiedades del origen de datos Configure SQLServerDataSource para su uso con JNDI y servidores de aplicaciones.
Trabajar con una conexión Abra, reutilice y cierre las conexiones correctamente.
Empleo de agrupación de conexiones Orígenes de datos JNDI e integración con grupos externos.
Resistencia de conexión Reintentos de conexión integrados y detección de conexiones interrumpidas.
Lógica de reintento configurable Reintente las instrucciones fallidas con retryExec y personalice la lista de reintento de conexión con retryConn.
Descripción de las propiedades de tiempo de espera en el controlador JDBC loginTimeout, queryTimeout, tiempos de espera del socket y cómo interactúan.
Implementación del controlador JDBC Empaquete e implemente el controlador con la aplicación.

Autenticación

Artículo Description
Autenticación de Microsoft Entra Identidad administrada, entidad de servicio, interactiva, integrada y autenticación de token de acceso.
Autenticación integrada de Kerberos Conéctese con Kerberos y Active Directory.
Autenticación NTLM Use las credenciales NTLM para autenticarse.
Autenticación de certificados de cliente para escenarios de bucle invertido Autenticar clientes con certificados en conexiones de loopback.

Secure

Artículo Description
Protección de las aplicaciones del controlador JDBC Guía de seguridad para aplicaciones Java que utilizan el controlador.
Seguridad de las aplicaciones Modelo de amenazas y recomendaciones detalladas de defensa.
Protección de cadenas de conexión Mantenga las credenciales y las cadenas de conexión fuera del origen.
Configuración del cliente para el cifrado Raíces de confianza, anclaje de certificados y configuración de TLS.
Conexión con cifrado Forzar encrypt=true y validar el certificado del servidor.
Descripción de la compatibilidad con cifrado Cómo el controlador negocia TLS con SQL Server.
Validación de los datos proporcionados por el usuario Parametrice SQL y evite la inyección.
Modo FIPS Ejecute el controlador en entornos compatibles con FIPS.
Always Encrypted Configure el cifrado del lado cliente para columnas confidenciales.
Always Encrypted con enclaves seguros Habilite operaciones avanzadas en columnas cifradas.
Referencia de la API de Always Encrypted Interfaz de la API para proveedores de cifrado de columnas y repositorios de claves.

Trabajar con datos

Artículo Description
Trabajando con sentencias y conjuntos de resultados Conceptos básicos de Statement, PreparedStatement y los conjuntos de resultados.
Uso de instrucciones con el controlador JDBC Ejecute instrucciones parametrizadas y no parametrizadas.
Control de instrucciones complejas Procedimientos almacenados, varios resultados y recuentos de actualizaciones.
Trabajo con conjuntos de resultados Recorrer en iteración, actualizar y desplazarse por los resultados de la consulta.
Empleo de varios conjuntos de resultados Controle las consultas que devuelven más de un conjunto de resultados.
Descripción de los tipos de cursor Cursores de solo avance, desplazables y actualizables.
Empleo de parámetros con valores de tabla Pase TABLE parámetros a procedimientos almacenados.
Uso de la copia masiva con el controlador JDBC Inserciones de alto rendimiento con SQLServerBulkCopy.
API de copia masiva para la inserción por lotes Acelere las cargas de trabajo de INSERT con executeBatch.
Realización de operaciones por lotes Inserciones, actualizaciones y eliminaciones por lotes.

Tipos de datos

Artículo Description
Trabajar con tipos de datos Asigne tipos de Java a tipos de SQL Server.
Descripción de los tipos de datos del controlador JDBC Sistema de tipo de controlador y asignaciones de JDBC.
Conversiones de tipos de datos Conversiones implícitas y explícitas entre Java y SQL Server.
Diferencias de tipos de datos Casos límite al mapear tipos a través de la frontera.
Tipo de datos JSON Almacenar y consultar columnas JSON.
Tipos de datos espaciales Usa geometry y geography en Java.
Tipo de datos vectorial Trabaje con el tipo vector de SQL Server.
sql_variant Leer y escribir columnas de tipo sql_variant.
Tipos definidos por el usuario Use tipos definidos por el usuario de CLR desde Java.
Compatibilidad con juegos de caracteres nacionales Gestión de Unicode y columnas nvarchar.
Características internacionales Consideraciones sobre configuración regional, cotejación y globalización.

Transacciones y simultaneidad

Artículo Description
Realización de transacciones commit, rollback y semántica de confirmación automática.
Descripción de las transacciones Ciclo de vida de las transacciones y procedimientos recomendados.
Niveles de aislamiento Instantánea, lectura confirmada, serializable, y otras.
Control de concurrencia Estrategias de concurrencia optimistas y pesimistas.
Bloqueo de filas Cómo SQL Server toma y libera bloqueos de fila.
Uso de puntos de guardado Reversión parcial dentro de una transacción.
Administración del tamaño de las transacciones Ajuste el ámbito de transacción para evitar bloqueos de larga duración.
Transacciones de XA Confirmación en dos fases con SQLServerXADataSource.

Rendimiento y confiabilidad

Artículo Description
Mejora del rendimiento y la confiabilidad Índices, consultas y ajuste a nivel de controlador.
Almacenamiento en caché de metadatos de sentencias preparadas Reutilizar los planes de instrucciones preparados.
Rendimiento del parámetro de instrucción preparada Tipado de parámetros y reutilización del plan de ejecución.
Búfer adaptable Transmita columnas grandes sin cargarlas completamente en la memoria.
Cierre de objetos cuando no se usan Libere rápidamente recursos Statement, ResultSet y Connection.
Alta disponibilidad y recuperación ante desastres Agentes de escucha del grupo de disponibilidad y conmutación por error de varias subredes.
Reflejo de la base de datos Use el controlador con asociados de creación de reflejo de la base de datos.

Diagnóstico y solución de problemas

Artículo Description
Diagnóstico de problemas del controlador JDBC Modos de seguimiento, registro y errores comunes.
Solución de problemas de conectividad Errores de conexión, fallos en el protocolo de enlace TLS e instancias con nombre.
Seguimiento del funcionamiento del controlador Habilitar el registro del JDK para el controlador.
Registrador de rendimiento y función de devolución de llamada Captura las métricas de rendimiento por sentencia.
Registro de eventos extendidos Correlacionar errores de cliente con eventos extendidos del lado servidor.
Control de errores SQLException, códigos de error y sugerencias de reintento.
Artículo Description
Notas de lanzamiento Historial de versiones y novedades de cada versión.
Dependencias de funcionalidades Dependencias opcionales para Entra ID, Kerberos, Always Encrypted y otros.
Cumplimiento de JDBC 4.3 Conformidad con la API de JDBC 4.3.
Cumplimiento de JDBC 4.2 Conformidad con la API de JDBC 4.2.
Cumplimiento de JDBC 4.1 Conformidad con la API de JDBC 4.1.
Cumplimiento normativo y aspectos legales Cumplimiento de especificaciones y licencias.
Referencia de API del controlador JDBC Clases, interfaces, métodos y campos expuestos por el controlador.
Aplicaciones de ejemplo del controlador JDBC Ejemplos de código de un extremo a otro.
Preguntas frecuentes Preguntas más frecuentes.