Compartir a través de


Configuración y solución de problemas de JDBC

En este artículo se describe la conectividad de bases de datos java (JDBC) y los pasos de solución de problemas que se producen durante la configuración. El foco está en JDBC para SQL Server.

Nota:

  • Este artículo se basa en el controlador JDBC más reciente (versión 12.4) instalado en la raíz de la unidad C .
  • Microsoft no soluciona problemas de conexiones JDBC en las que existe un administrador de grupos de conexiones de terceros. La solución de problemas con un administrador de grupos de conexiones de terceros tiene el potencial de exponer información de propiedad intelectual.

Microsoft JDBC Driver para SQL Server

En este artículo se proporciona una guía de referencia a JDBC, incluido el controlador y la documentación auxiliar, las instrucciones de instalación de diferentes sistemas operativos (SO) y la solución de problemas de conexión de SQL Server.

Cambios en la versión del controlador JDBC

Requisitos de JDBC

  • La versión de Java Runtime Environment (JRE) debe coincidir con el controlador con la versión JRE especificada en el nombre. Por ejemplo, mssql-jdbc-9.4.1.jre8.jar requiere JRE 1.8 y mssql-jdbc-9.4.1.jre11.jar requiere JRE 11.0.

  • CLASSPATH es una variable de entorno de Java que contiene la ruta de acceso del directorio y los archivos jar binarios. Java lo necesita para ejecutar la aplicación deseada. Es un requisito especificar qué archivos jar binarios de controlador y dependencia necesita ejecutar Java. El mínimo CLASSPATH incluye el directorio .; de trabajo actual y la ubicación del archivo jar del controlador JDBC.

Pasos de configuración y solución de problemas de JDBC

Establecimiento de la variable CLASSPATH

CLASSPATHs se puede definir en la variable de entorno del sistema operativo o en el propio entorno de aplicación, como Tomcat. Si CLASSPATH se define en el entorno de la aplicación, el proveedor de la aplicación o el desarrollador deben estar comprometidos para asegurarse de que se han implementado las configuraciones adecuadas CLASSPATH .

Para establecer CLASSPATH, use uno de los métodos siguientes:

Nota:

La configuración del símbolo del sistema es temporal y se quitará al cerrar la ventana del símbolo del sistema. La interfaz gráfica de usuario (GUI) es una configuración permanente y requiere un reinicio.

Ejemplo del símbolo del sistema

Set CLASSPATH=.;C:\sqljdbc_12.4\enu\mssql-jdbc-12.4.0.jre8.jar

Ejemplo de GUI

Para establecer CLASSPATH con la GUI, siga estos pasos:

  1. Abra Panel de control y seleccione Sistema y seguridad.

  2. Seleccione Configuración>avanzada del sistema.

  3. Seleccione Variables de>entorno Nuevo y escriba CLASSPATH como nombre de variable.

  4. Seleccione Editar y escriba .; C:\sqljdbc_12.4\enu\mssql-jdbc-12.4.0.jre8.jar como valor de variable.

  5. Seleccione Aceptar.

Cadenas de conexión con credenciales pasadas

Un cadena de conexión con credenciales pasadas hace referencia a un cadena de conexión que incluye credenciales de autenticación (como nombre de usuario y contraseña) como parámetros o valores dentro de la cadena. Cuando un programa se conecta a una base de datos u otro servicio, debe proporcionar información de autenticación para establecer una conexión segura.

En el siguiente cadena de conexión se muestra un ejemplo de cómo conectarse a una base de datos de SQL Server en función del modo de autenticación que desea usar:

Los inicios de sesión de autenticación

La cadena de conexión es String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MySQLAuthAccount>;password=<MyPassword>;trustServerCertificate=true;"

Autenticación de Windows AD sin seguridad integrada

La cadena de conexión es String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MyADAuthAccount>;password=<MyPassword>;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=NTLM"

Autenticación de Windows AD con Kerberos y sin seguridad integrada

La cadena de conexión es String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MyADAuthAccount>;password=<MyPassword>;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=JavaKerberos"

Conexión NTLM integrada

En este tipo de conexión, la máquina cliente debe estar en un dominio de Windows.

El archivo mssql-jdbc_auth-version-arch>><<.dll debe estar en las siguientes rutas de acceso:

  • DLL de 64 bits

    %Path%;C:\sqljdbc_12.4.1.0_enu\sqljdbc_12.4\enu\auth\x64\mssql-jdbc_auth-12.4.1.x64.dll

  • DLL de 32 bits

    %Path%;C:\sqljdbc_12.4.1.0_enu\sqljdbc_12.4\enu\auth\x86\mssql-jdbc_auth-12.4.1.x86.dll

Puede modificar y agregar la ruta de acceso o copiar el archivo en una ruta de acceso ya establecida. Para obtener más información, consulte Conexión con autenticación integrada en Windows.

La cadena de conexión es String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;integratedSecurity=true;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=NTLM"

Conexiones Kerberos integradas

Los requisitos previos para este tipo de conexión son:

  • Debe formar parte de un dominio.
  • Debe tener SSSD instalado y configurado en el sistema operativo Linux.
  • Debe tener Klist instalado y configurado en el sistema operativo Linux.

El archivo mssql-jdbc_auth-version-arch>><<.dll debe estar en las siguientes rutas de acceso. Puede modificar y agregar la ruta de acceso o copiar el archivo en una ruta de acceso ya establecida.

  • DLL de 64 bits

    %Path%;C:\sqljdbc_12.4.1.0_enu\sqljdbc_12.4\enu\auth\x64\mssql-jdbc_auth-12.4.1.x64.dll

  • DLL de 32 bits

    %Path%;C:\sqljdbc_12.4.1.0_enu\sqljdbc_12.4\enu\auth\x86\mssql-jdbc_auth-12.4.1.x86.dll

También tiene que crear un archivo Jaas.conf . De forma predeterminada, este archivo no viene con el controlador y no se instala con Java. Para ayudar al entorno a localizar este archivo, use uno de los métodos siguientes:

Nota:

El archivo Jaas.conf permitirá a Java usar el contexto actual del usuario que ha iniciado sesión. También indicará a Java que use los vales kerberos almacenados actualmente en caché.

  • Modifique la siguiente línea en el archivo Java.Security :

    # Default login configuration file
    
    login.config.url.1=C:=\<Path to the File>\jaas.conf
    
  • Como alternativa, agregue el archivo Jaas.conf a través de un parámetro al cargar el entorno o la aplicación. Asegúrese de usar el mismo parámetro al compilar el archivo Java:

    javac -Djava.security.auth.login.config=c:\myDirectory\Jaas.conf myapp.java
    java -Djava.security.auth.login.config=c:\myDirectory\Jaas.conf myapp
    

Para establecer una conexión a un servidor SQL Server mediante la autenticación integrada kerberos, configure el archivo Jaas.conf :

SQLJDBCDriver {
com.sun.security.auth.module.Krb5LoginModule required 
useTicketCache=true; 
};

La cadena de conexión es String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;integratedSecurity=true;Domain=<MyyDomain>;trustServerCertificate=true;javaAuthentication=JavaKerberos;"

Código de ejemplo

Todos los controladores JDBC incluyen código de ejemplo en el directorio \sqljdbc_12.4\enu\samples . La más usada es en \sqljdbc_12.4\enu\samples\connections\ConnectURR.java. Cree un archivo denominado ConnectURL.java o use ConnectURL.java del ejemplo proporcionado con el controlador.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class ConnectURL {
    public static void main(String[] args) {

        // Create a variable for the connection string. Base the connection string on the previous examples supplied in the above documentation.
        String connectionUrl = "jdbc:sqlserver://ServerName:Port;user=SQLAuthAccount;password=SomePassword;trustServerCertificate=true;";

        try (Connection con = DriverManager.getConnection(connectionUrl); Statement stmt = con.createStatement();) 
	{
                String SQL = "SELECT @@version";
	        ResultSet rs = stmt.executeQuery(SQL);
                // Iterate through the data in the result set and display it.
                while (rs.next()) 
		{
                     System.out.println(rs.getString(1));
            	}
        }
        // Handle any errors that may have occurred.
        catch (SQLException e) 
        {e.printStackTrace();    }
  }
}

Seguimiento del controlador JDBC

Por lo general, siempre queremos establecer el seguimiento FINEST en para obtener más detalles. Hay dos métodos para el seguimiento de controladores: habilitar el seguimiento mediante programación y habilitar el seguimiento mediante el archivo logging.properties.

Si decide usar el archivo logging.properties, debe encontrar el entorno correcto para el archivo logging.properties. $JAVA_HOME\conf\ y $JAVA_HOME\jre\lib son dos ubicaciones posibles.

Siga estos pasos para configurar este archivo:

  1. Modifique el archivo logging.properties para asegurarse de que es similar a las siguientes propiedades globales:

    ############################################################
    #  Global properties
    ############################################################
    # "handlers" specifies a comma-separated list of log Handler
    # classes. These handlers will be installed during VM startup.
    # Note that these classes must be on the system classpath.
    # By default, we only configure a ConsoleHandler, which will only
    # show messages at the INFO and above levels.
    
    handlers= java.util.logging.ConsoleHandler
    
    # To also add the FileHandler, use the following line instead.
    #handlers= java.util.logging.FileHandler
    
    # Default global logging level.
    # This specifies which kinds of events are logged across
    # all loggers.  For any given facility this global level
    # can be overridden by a facility-specific level
    # Note that the ConsoleHandler also has a separate level
    # setting to limit messages printed to the console.
    
    .level= INFO
    

    Los controladores indican a Java dónde exportar la salida. Hay dos ubicaciones donde FileHandler escribe en un archivo y ConsoleHandler escribe en una ventana de consola. La salida generará una gran cantidad de datos, por lo que debe escribirse en un archivo.

    • Línea de comentario

      #handlers= java.util.logging.ConsoleHandler
      
    • Quitar marca de comentario de línea

      handlers= java.util.logging.FileHandler
      

    Nota:

    OFF Establézcalo .level en y no verá mensajes en la ventana de la consola.

     .level=OFF
    
  2. Establezca el registro de FileHandler específico:

    ############################################################
    # Handler specific properties.
    # Describes specific configuration info for Handlers.
    ############################################################
    
    # default file output is in user's home directory.
    java.util.logging.FileHandler.pattern = %h/java%u.log
    java.util.logging.FileHandler.limit = 50000
    java.util.logging.FileHandler.count = 1
    # Default number of locks FileHandler can obtain synchronously.
    # This specifies maximum number of attempts to obtain lock file by FileHandler
    # implemented by incrementing the unique field %u as per FileHandler API documentation.
    java.util.logging.FileHandler.maxLocks = 100
    java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
    
    # Limit the messages that are printed on the console to INFO and above.
    java.util.logging.ConsoleHandler.level = INFO
    java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
    
    # Example to customize the SimpleFormatter output format
    # to print one-line log message like this:
    #     <level>: <log message> [<date/time>]
    #
    # java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n
    
  3. Modifique esta parte para asegurarse de que es similar o contiene las siguientes líneas:

    java.util.logging.FileHandler.pattern = /Path/java%u.log
    java.util.logging.FileHandler.limit = 5000000
    java.util.logging.FileHandler.count = 20
    java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
    java.util.logging.FileHandler.level = FINEST
    
  4. Modifique la java.util.logging.FileHandler.pattern = %h/java%u.log línea y reemplace %h/ por una ruta de acceso que desee almacenar el archivo. Por ejemplo:

    java.util.logging.FileHandler.pattern = c:/Temp/java%u.log

  5. Establezca el nivel de registro del controlador:

    Agregue com.microsoft.sqlserver.jdbc.level=FINEST en la parte inferior de la sección siguiente:

    ############################################################
    # Facility-specific properties.
    # Provides extra control for each logger.
    ############################################################
    
    # For example, set the com.xyz.foo logger to only log SEVERE
    # messages:
    # com.xyz.foo.level = SEVERE
    
  6. Guarde los cambios.

    El archivo debe tener un aspecto similar al siguiente:

    ############################################################
    #  Default Logging Configuration File
    #
    # You can use a different file by specifying a filename
    # with the java.util.logging.config.file system property.
    # For example, java -Djava.util.logging.config.file=myfile
    ############################################################
    
    ############################################################
    #  Global properties
    ############################################################
    
    # "handlers" specifies a comma-separated list of log Handler
    # classes.  These handlers will be installed during VM startup.
    # Note that these classes must be on the system classpath.
    # By default we only configure a ConsoleHandler, which will only
    # show messages at the INFO and above levels.
    #handlers= java.util.logging.ConsoleHandler
    
    # To also add the FileHandler, use the following line instead.
    handlers= java.util.logging.FileHandler
    
    # Default global logging level.
    # This specifies which kinds of events are logged across
    # all loggers.  For any given facility this global level
    # can be overridden by a facility-specific level
    # Note that the ConsoleHandler also has a separate level
    # setting to limit messages printed to the console.
    .level= OFF
    
    ############################################################
    # Handler specific properties.
    # Describes specific configuration info for Handlers.
    ############################################################
    
    # default file output is in user's home directory.
    java.util.logging.FileHandler.pattern = c:/Temp/java%u.log
    java.util.logging.FileHandler.limit = 50000
    java.util.logging.FileHandler.count = 1
    # Default number of locks FileHandler can obtain synchronously.
    # This specifies maximum number of attempts to obtain lock file by FileHandler
    # implemented by incrementing the unique field %u as per FileHandler API documentation.
    java.util.logging.FileHandler.maxLocks = 100
    java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
    
    # Limit the messages that are printed on the console to INFO and above.
    #java.util.logging.ConsoleHandler.level = INFO
    #java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
    
    # Example to customize the SimpleFormatter output format
    # to print one-line log message like this:
    #     <level>: <log message> [<date/time>]
    #
    # java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n
    
    ############################################################
    # Facility-specific properties.
    # Provides extra control for each logger.
    ############################################################
    
    # For example, set the com.xyz.foo logger to only log SEVERE
    # messages:
    # com.xyz.foo.level = SEVERE
    com.microsoft.sqlserver.jdbc.level=FINEST
    

Después de reproducir el error, revierta los cambios para impedir que el registrador cree archivos.

Como alternativa, puede crear o copiar el texto anterior, guardarlo en un archivo y agregarlo al comando de inicio al cargar la aplicación.

java -Djava.util.logging.config.file=c:\<Path to the file>\logging.properties myapp

Esto le permitiría identificar un archivo logging.properties que no se especifica en los directorios predeterminados $JAVA_HOME\conf\ y $JAVA_HOME\jre\lib a través de una línea de comandos.

Aviso de declinación de responsabilidades sobre la información de terceros

Los productos de otros fabricantes que se mencionan en este artículo han sido creados por compañías independientes de Microsoft. Microsoft no ofrece ninguna garantía, ya sea implícita o de otro tipo, sobre la confiabilidad o el rendimiento de dichos productos.