Partager via


Configuration et résolution des problèmes JDBC

Cet article décrit la connectivité de base de données Java (JDBC) et les étapes de résolution des problèmes qui se produisent pendant la configuration. Le focus est mis sur JDBC pour SQL Server.

Note

  • Cet article est basé sur le dernier pilote JDBC (version 12.4) installé à la racine du lecteur C .
  • Microsoft ne résout pas les problèmes de connexion JDBC lorsqu’un gestionnaire de pool de connexions tiers existe. La résolution des problèmes avec un gestionnaire de pool de connexions tiers peut exposer des informations sur la propriété intellectuelle.

Pilote Microsoft JDBC pour SQL Server

Cet article fournit un guide de référence à JDBC, y compris le pilote et la documentation de prise en charge, les instructions d’installation pour différents systèmes d’exploitation et la résolution des problèmes de connexion SQL Server.

Modifications de version du pilote JDBC

Configuration requise pour JDBC

  • La version JRE (Java Runtime Environment) doit correspondre au pilote avec la version JRE spécifiée dans le nom. Par exemple, mssql-jdbc-9.4.1.jre8.jar nécessite JRE 1.8 et mssql-jdbc-9.4.1.jre11.jar nécessite JRE 11.0.

  • CLASSPATH est une variable d’environnement Java qui contient le chemin d’accès au répertoire et les fichiers jar binaires. Java a besoin qu’il exécute l’application souhaitée. Il est nécessaire de spécifier le pilote et les fichiers jar binaires de dépendance que Java doit exécuter. Le minimum CLASSPATH inclut le répertoire .; de travail actuel et l’emplacement du fichier jar du pilote JDBC.

Étapes de configuration et de résolution des problèmes JDBC

Définir la variable CLASSPATH

Les CLASSPATH peuvent être définis dans la variable d’environnement du système d’exploitation ou dans l’environnement d’application lui-même, comme Tomcat. S’il CLASSPATH est défini dans l’environnement d’application, le fournisseur d’application ou le développeur doit être engagé pour s’assurer que les configurations appropriées CLASSPATH sont en place.

Pour définir CLASSPATH, utilisez l’une des méthodes suivantes :

Note

Le paramètre d’invite de commandes est temporaire et sera supprimé lorsque vous fermez la fenêtre d’invite de commandes. L’interface utilisateur graphique (GUI) est un paramètre permanent et nécessite un redémarrage.

Exemple d’invite de commandes

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

Exemple d’interface graphique graphique

Pour définir CLASSPATH à l’aide de l’interface utilisateur graphique, procédez comme suit :

  1. Ouvrez Panneau de configuration et sélectionnez Système et Sécurité.

  2. Sélectionnez Paramètres système avancés du>système.

  3. Sélectionnez Variables>d’environnement Nouveau, puis entrez CLASSPATH comme nom de variable.

  4. Sélectionnez Modifier et entrer . ; C :\sqljdbc_12.4\enu\mssql-jdbc-12.4.0.jre8.jar comme valeur de variable.

  5. Cliquez sur OK.

Chaînes de connexion avec informations d’identification transmises

Une chaîne de connexion avec des informations d’identification transmises fait référence à une chaîne de connexion qui inclut des informations d’identification d’authentification (telles que le nom d’utilisateur et le mot de passe) en tant que paramètres ou valeurs dans la chaîne. Lorsqu’un programme se connecte à une base de données ou à un autre service, il doit fournir des informations d’authentification pour établir une connexion sécurisée.

La chaîne de connexion suivante montre un exemple de connexion à une base de données SQL Server en fonction du mode d’authentification que vous souhaitez utiliser :

Authentification SQL Server

Chaîne de connexion : String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MySQLAuthAccount>;password=<MyPassword>;trustServerCertificate=true;"

Authentification Windows AD sans sécurité intégrée

Chaîne de connexion : String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MyADAuthAccount>;password=<MyPassword>;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=NTLM"

Authentification Windows AD avec Kerberos et sans sécurité intégrée

Chaîne de connexion : String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MyADAuthAccount>;password=<MyPassword>;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=JavaKerberos"

Connexion NTLM intégrée

Dans ce type de connexion, l’ordinateur client doit se trouver dans un domaine Windows.

Le fichier mssql-jdbc_auth-version-arch>><<.dll doit se trouver dans les chemins suivants :

  • DLL 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 32 bits

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

Vous pouvez modifier et ajouter le chemin d’accès ou copier le fichier dans un chemin déjà établi. Pour plus d’informations, consultez Connexion avec l’authentification intégrée sur Windows.

Chaîne de connexion : String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;integratedSecurity=true;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=NTLM"

Connexions Kerberos intégrées

Les conditions préalables pour ce type de connexion sont les suivantes :

  • Doit faire partie d’un domaine.
  • Doit avoir installé et configuré SSSD sur le système d’exploitation Linux.
  • Klist doit être installé et configuré sur le système d’exploitation Linux.

Le fichier mssql-jdbc_auth-version-arch>><<.dll doit se trouver dans les chemins suivants. Vous pouvez modifier et ajouter le chemin d’accès ou copier le fichier dans un chemin déjà établi.

  • DLL 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 32 bits

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

Vous devez également créer un fichier Jaas.conf . Par défaut, ce fichier n’est pas associé au pilote et n’est pas installé avec Java. Pour aider l’environnement à localiser ce fichier, utilisez l’une des méthodes suivantes :

Note

Le fichier Jaas.conf permet à Java d’utiliser le contexte actuel de l’utilisateur connecté. Il indique également à Java d’utiliser les tickets Kerberos actuellement mis en cache.

  • Modifiez la ligne suivante dans le fichier Java.Security :

    # Default login configuration file
    
    login.config.url.1=C:=\<Path to the File>\jaas.conf
    
  • Vous pouvez également ajouter le fichier Jaas.conf via un paramètre lorsque vous chargez votre environnement ou votre application. Veillez à utiliser le même paramètre lorsque vous compilez le fichier Java :

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

Pour établir une connexion à un serveur SQL Server à l’aide de l’authentification intégrée Kerberos, configurez le fichier Jaas.conf :

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

Chaîne de connexion : String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;integratedSecurity=true;Domain=<MyyDomain>;trustServerCertificate=true;javaAuthentication=JavaKerberos;"

Exemple de code

Tous les pilotes JDBC sont fournis avec un exemple de code dans le répertoire \sqljdbc_12.4\enu\samples . Le plus couramment utilisé est dans \sqljdbc_12.4\enu\samples\connections\ConnectURR.java. Créez un fichier appelé ConnectURL.java ou utilisez ConnectURL.java à partir de l’exemple fourni avec le pilote.

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();    }
  }
}

Suivi du pilote JDBC

En règle générale, nous voulons toujours définir le suivi FINEST pour plus de détails. Il existe deux méthodes pour le suivi des pilotes : activer le suivi par programme et activer le suivi à l’aide du fichier logging.properties.

Si vous choisissez d’utiliser le fichier logging.properties, vous devez trouver l’environnement approprié pour le fichier logging.properties. $JAVA_HOME\conf\ et $JAVA_HOME\jre\lib sont deux emplacements possibles.

Procédez comme suit pour configurer ce fichier :

  1. Modifiez le fichier logging.properties pour vous assurer qu’il ressemble aux propriétés globales suivantes :

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

    Les gestionnaires indiquent à Java où exporter la sortie. Il existe deux emplacements où FileHandler écrit dans un fichier et consoleHandler écrit dans une fenêtre de console. La sortie génère un grand nombre de données, de sorte qu’elle doit être écrite dans un fichier.

    • Ligne de commentaire

      #handlers= java.util.logging.ConsoleHandler
      
    • Annuler les marques de commentaire

      handlers= java.util.logging.FileHandler
      

    Note

    Défini .level sur OFF et vous ne verrez pas les messages dans la fenêtre de console.

     .level=OFF
    
  2. Définissez la journalisation de FileHandler spécifique :

    ############################################################
    # 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. Modifiez cette partie pour vous assurer qu’elle ressemble ou contient les lignes suivantes :

    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. Modifiez la java.util.logging.FileHandler.pattern = %h/java%u.log ligne et remplacez %h/ par un chemin d’accès que vous souhaitez stocker le fichier. Par exemple :

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

  5. Définissez le niveau de journalisation du pilote :

    Ajoutez com.microsoft.sqlserver.jdbc.level=FINEST au bas de la section suivante :

    ############################################################
    # 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. Enregistrez les modifications.

    Le fichier doit ressembler à ce qui suit :

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

Après avoir reproduit l’erreur, rétablissez les modifications pour empêcher l’enregistreur d’événements de créer des fichiers.

Vous pouvez également créer ou copier le texte ci-dessus, l’enregistrer dans un fichier et ajouter le fichier à la commande de démarrage lors du chargement de l’application.

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

Cela vous permet d’identifier un fichier logging.properties qui n’est pas spécifié dans les répertoires $JAVA_HOME\conf\ par défaut et $JAVA_HOME\jre\lib via une ligne de commande.

Exclusion de responsabilité de tiers

Les produits tiers mentionnés dans le présent article sont fabriqués par des sociétés indépendantes de Microsoft. Microsoft exclut toute garantie, implicite ou autre, concernant les performances ou la fiabilité de ces produits.