Dela via


JDBC-konfiguration och felsökning

I den här artikeln beskrivs Java-databasanslutning (JDBC) och de felsökningssteg som inträffar under konfigurationen. Fokus ligger på JDBC för SQL Server.

Kommentar

  • Den här artikeln baseras på den senaste JDBC-drivrutinen (version 12.4) som är installerad i C-enhetens rot.
  • Microsoft felsöker inte JDBC-anslutningar där det finns en poolhanterare från tredje part. Felsökning med en anslutningspoolshanterare från tredje part har potential att exponera information om immateriella rättigheter.

Microsoft JDBC-drivrutin för SQL Server

Den här artikeln innehåller referensguide till JDBC, inklusive drivrutinen och stöddokumentationen, installationsinstruktioner för olika operativsystem (OS) och felsökning av anslutningsproblem med SQL Server.

Ändringar i JDBC-drivrutinsversionen

JDBC-krav

  • JrE-versionen (Java Runtime Environment) måste matcha drivrutinen med den JRE-version som anges i namnet. Mssql-jdbc-9.4.1.jre8.jar kräver till exempel JRE 1.8 och mssql-jdbc-9.4.1.jre11.jar kräver JRE 11.0.

  • CLASSPATH är en Java-miljövariabel som innehåller katalogsökvägen och binära jar-filer. Java behöver det för att köra önskat program. Det är ett krav att ange vilken drivrutin och beroende binär jar-filer Java behöver köra. Minimum CLASSPATH inkluderar den aktuella arbetskatalogen .; och platsen för JDBC-drivrutins jar-filen.

JDBC-konfigurations- och felsökningssteg

Ange CLASSPATH-variabeln

CLASSPATH:er kan definieras i os-miljövariabeln eller i själva programmiljön, till exempel Tomcat. Om CLASSPATH definieras i programmiljön måste programleverantören eller utvecklaren vara engagerade för att säkerställa att rätt CLASSPATH konfigurationer finns på plats.

Om du vill ange CLASSPATHanvänder du någon av följande metoder:

Kommentar

Kommandotolkens inställning är tillfällig och tas bort när du stänger kommandotolken. Det grafiska användargränssnittet (GUI) är en permanent inställning och kräver en omstart.

Exempel på kommandotolk

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

GUI-exempel

Följ dessa steg om du vill ange CLASSPATH med hjälp av användargränssnittet:

  1. Öppna Kontrollpanelen och välj System och säkerhet.

  2. Välj System>Avancerade systeminställningar.

  3. Välj Miljövariabler>Ny och ange sedan CLASSPATH som variabelnamn.

  4. Välj Redigera och ange .; C:\sqljdbc_12.4\enu\mssql-jdbc-12.4.0.jre8.jar som variabelvärde.

  5. Välj OK.

Anslutningssträngar med inloggade autentiseringsuppgifter

En anslutningssträng med skickade autentiseringsuppgifter refererar till en anslutningssträng som innehåller autentiseringsuppgifter (till exempel användarnamn och lösenord) som parametrar eller värden i strängen. När ett program ansluter till en databas eller en annan tjänst måste det tillhandahålla autentiseringsinformation för att upprätta en säker anslutning.

Följande anslutningssträng visar ett exempel på hur du ansluter till en SQL Server-databas baserat på det autentiseringsläge som du vill använda:

SQL Server-autentisering

Anslutningssträngen är String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MySQLAuthAccount>;password=<MyPassword>;trustServerCertificate=true;"

Windows AD-autentisering utan integrerad säkerhet

Anslutningssträngen är String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MyADAuthAccount>;password=<MyPassword>;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=NTLM"

Windows AD-autentisering med Kerberos och utan integrerad säkerhet

Anslutningssträngen är String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MyADAuthAccount>;password=<MyPassword>;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=JavaKerberos"

Integrerad NTLM-anslutning

I den här typen av anslutning måste klientdatorn finnas i en Windows-domän.

Filen mssql-jdbc_auth-version-arch<>><.dll måste finnas i följande sökvägar:

  • 64-bitars DLL

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

  • 32-bitars DLL

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

Du kan antingen ändra och lägga till sökvägen eller kopiera filen till en redan etablerad sökväg. Mer information finns i Ansluta med integrerad autentisering i Windows.

Anslutningssträngen är String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;integratedSecurity=true;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=NTLM"

Integrerade Kerberos-anslutningar

Förutsättningarna för den här typen av anslutning är:

  • Måste vara en del av en domän.
  • Måste ha SSSD installerat och konfigurerat på Linux OS.
  • Klist måste vara installerat och konfigurerat i Linux-operativsystemet.

Filen mssql-jdbc_auth-version-arch<>><.dll måste finnas i följande sökvägar. Du kan antingen ändra och lägga till sökvägen eller kopiera filen till en redan etablerad sökväg.

  • 64-bitars DLL

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

  • 32-bitars DLL

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

Du måste också skapa en Jaas.conf-fil . Som standard kommer den här filen inte med drivrutinen och installeras inte med Java. Använd någon av följande metoder för att hjälpa miljön att hitta den här filen:

Kommentar

Jaas.conf-filen gör att Java kan använda den inloggade användarens aktuella kontext. Det uppmanar också Java att använda de för närvarande cachelagrade Kerberos-biljetterna.

  • Ändra följande rad i Java.Security-filen :

    # Default login configuration file
    
    login.config.url.1=C:=\<Path to the File>\jaas.conf
    
  • Du kan också lägga till jaas.conf-filen via en parameter när du läser in din miljö eller ditt program. Se till att du använder samma parameter när du kompilerar Java-filen:

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

Konfigurera Jaas.conf-filen för att upprätta en anslutning till en SQL Server med kerberos-integrerad autentisering:

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

Anslutningssträngen är String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;integratedSecurity=true;Domain=<MyyDomain>;trustServerCertificate=true;javaAuthentication=JavaKerberos;"

Exempelkod

Alla JDBC-drivrutiner levereras med exempelkod i katalogen \sqljdbc_12.4\enu\samples . Den vanligaste är i \sqljdbc_12.4\enu\samples\connections\ConnectURR.java. Skapa en fil med namnet ConnectURL.java eller använd ConnectURL.java från exemplet som medföljer drivrutinen.

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

JDBC-drivrutinsspårning

I allmänhet vill vi alltid ange spårning till FINEST för mer information. Det finns två metoder för spårning av drivrutiner: aktivera spårning programmatiskt och aktivera spårning med hjälp av filen logging.properties.

Om du väljer att använda filen logging.properties måste du hitta rätt miljö för filen logging.properties . $JAVA_HOME\conf\ och $JAVA_HOME\jre\lib är två möjliga platser.

Följ dessa steg för att konfigurera den här filen:

  1. Ändra filen logging.properties så att den liknar följande globala egenskaper:

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

    Hanterare talar om för Java var utdata ska exporteras. Det finns två platser där FileHandler skriver till en fil och ConsoleHandler skriver till ett konsolfönster. Utdata genererar massor av data, så de måste skrivas till en fil.

    • Kommentarsrad

      #handlers= java.util.logging.ConsoleHandler
      
    • Avkommentarsrad

      handlers= java.util.logging.FileHandler
      

    Kommentar

    Ange .level till OFF så visas inte meddelanden i konsolfönstret.

     .level=OFF
    
  2. Ange den specifika FileHandler-loggningen:

    ############################################################
    # 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. Ändra den här delen för att se till att den liknar eller innehåller följande rader:

    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. Ändra raden java.util.logging.FileHandler.pattern = %h/java%u.log och ersätt %h/ med en sökväg som du vill att filen ska lagras på. Till exempel:

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

  5. Ange drivrutinsloggningsnivå:

    Lägg till com.microsoft.sqlserver.jdbc.level=FINEST längst ned i följande avsnitt:

    ############################################################
    # 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. Spara ändringarna.

    Filen bör se ut så här:

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

När du har återskapat felet återställer du ändringarna för att hindra loggaren från att skapa filer.

Du kan också skapa eller kopiera texten ovan, spara den i en fil och lägga till filen i startkommandot när programmet läses in.

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

På så sätt kan du identifiera en logging.properties-fil som inte har angetts i standardkatalogerna $JAVA_HOME\conf\ och $JAVA_HOME\jre\lib via en kommandorad.

Ansvarsfriskrivning för information från tredje part

De produkter från andra tillverkare som diskuteras i denna artikel tillverkas oberoende av Microsoft. Produkternas funktion eller tillförlitlighet kan därför inte garanteras.