Udostępnij za pośrednictwem


Konfiguracja JDBC i rozwiązywanie problemów

W tym artykule opisano łączność bazy danych Java (JDBC) i kroki rozwiązywania problemów występujące podczas konfiguracji. Koncentruje się on na JDBC dla programu SQL Server.

Uwaga 16.

  • Ten artykuł jest oparty na najnowszym sterowniku JDBC (wersja 12.4) zainstalowanym w katalogu głównym dysku C .
  • Firma Microsoft nie rozwiązuje problemów z połączeniami JDBC, w których istnieje menedżer puli połączeń innej firmy. Rozwiązywanie problemów z menedżerem puli połączeń innej firmy może uwidocznić informacje o własności intelektualnej.

Sterownik JDBC firmy Microsoft dla programu SQL Server

Ten artykuł zawiera przewodnik referencyjny dotyczący JDBC, w tym sterownik i dokumentację pomocniczą, instrukcje instalacji dla różnych systemów operacyjnych i rozwiązywanie problemów z połączeniem z programem SQL Server.

Zmiany wersji sterownika JDBC

Wymagania dotyczące JDBC

  • Wersja środowiska Java Runtime Environment (JRE) musi być zgodna ze sterownikiem z wersją środowiska JRE określoną w nazwie. Na przykład mssql-jdbc-9.4.1.jre8.jar wymaga środowiska JRE 1.8, a mssql-jdbc-9.4.1.jre11.jar wymaga środowiska JRE 11.0.

  • CLASSPATH to zmienna środowiskowa Języka Java zawierająca ścieżkę katalogu i binarne pliki jar. Język Java wymaga wykonania żądanej aplikacji. Należy określić, które pliki jar sterownika i zależności muszą być uruchamiane przez środowisko Java. Minimum CLASSPATH obejmuje bieżący katalog .; roboczy i lokalizację pliku jar sterownika JDBC.

Kroki konfiguracji JDBC i rozwiązywania problemów

Ustawianie zmiennej CLASSPATH

KlasyPATHs można zdefiniować w zmiennej środowiskowej systemu operacyjnego lub w samym środowisku aplikacji, na przykład Tomcat. Jeśli CLASSPATH program jest zdefiniowany w środowisku aplikacji, dostawca aplikacji lub deweloper musi być zaangażowany, aby zapewnić odpowiednie CLASSPATH konfiguracje.

Aby ustawić CLASSPATHmetodę , użyj jednej z następujących metod:

Uwaga 16.

Ustawienie wiersza polecenia jest tymczasowe i zostanie usunięte po zamknięciu okna wiersza polecenia. Graficzny interfejs użytkownika (GUI) jest stałym ustawieniem i wymaga ponownego uruchomienia.

Przykład wiersza polecenia

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

Przykład graficznego interfejsu użytkownika

Aby ustawić CLASSPATH użycie graficznego interfejsu użytkownika, wykonaj następujące kroki:

  1. Otwórz Panel sterowania i wybierz pozycję System i zabezpieczenia.

  2. Wybierz pozycję Ustawienia systemu>zaawansowanego systemu.

  3. Wybierz pozycję Zmienne środowiskowe>Nowy, a następnie wprowadź ciąg CLASSPATH jako nazwę zmiennej.

  4. Wybierz pozycję Edytuj i wprowadź . ; C:\sqljdbc_12.4\enu\mssql-jdbc-12.4.0.jre8.jar jako wartość zmiennej.

  5. Wybierz przycisk OK.

Parametry połączenia z przekazanymi poświadczeniami

Parametry połączenia z przekazanymi poświadczeniami odnosi się do parametry połączenia, która zawiera poświadczenia uwierzytelniania (takie jak nazwa użytkownika i hasło) jako parametry lub wartości w ciągu. Gdy program łączy się z bazą danych lub inną usługą, musi podać informacje uwierzytelniania w celu nawiązania bezpiecznego połączenia.

Poniższy parametry połączenia przedstawia przykład sposobu nawiązywania połączenia z bazą danych programu SQL Server na podstawie trybu uwierzytelniania, którego chcesz użyć:

Uwierzytelnianie programu SQL Server

Parametry połączenia to String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MySQLAuthAccount>;password=<MyPassword>;trustServerCertificate=true;"

Uwierzytelnianie usługi AD systemu Windows bez zintegrowanych zabezpieczeń

Parametry połączenia to String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MyADAuthAccount>;password=<MyPassword>;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=NTLM"

Uwierzytelnianie w usłudze Windows AD przy użyciu protokołu Kerberos i bez zintegrowanych zabezpieczeń

Parametry połączenia to String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MyADAuthAccount>;password=<MyPassword>;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=JavaKerberos"

Zintegrowane połączenie NTLM

W tym rodzaju połączenia komputer kliencki musi znajdować się w domenie systemu Windows.

Plik mssql-jdbc_auth-version-arch<>><.dll musi znajdować się w następujących ścieżkach:

  • 64-bitowa biblioteka DLL

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

  • 32-bitowa biblioteka DLL

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

Możesz zmodyfikować i dodać ścieżkę lub skopiować plik do już ustalonej ścieżki. Aby uzyskać więcej informacji, zobacz Łączenie z zintegrowanym uwierzytelnianiem w systemie Windows.

Parametry połączenia to String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;integratedSecurity=true;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=NTLM"

Zintegrowane połączenia Kerberos

Wymagania wstępne dotyczące tego typu połączenia to:

  • Musi być częścią domeny.
  • W systemie operacyjnym Linux musi być zainstalowany i skonfigurowany plik SSSD.
  • Musi mieć zainstalowaną i skonfigurowaną listę Klist w systemie operacyjnym Linux.

Plik mssql-jdbc_auth-version-arch<>><.dll musi znajdować się w następujących ścieżkach. Możesz zmodyfikować i dodać ścieżkę lub skopiować plik do już ustalonej ścieżki.

  • 64-bitowa biblioteka DLL

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

  • 32-bitowa biblioteka DLL

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

Musisz również utworzyć plik Jaas.conf . Domyślnie ten plik nie jest dołączony do sterownika i nie jest instalowany z językiem Java. Aby ułatwić środowisko lokalizowania tego pliku, użyj jednej z następujących metod:

Uwaga 16.

Plik Jaas.conf umożliwi środowisku Java korzystanie z bieżącego kontekstu zalogowanego użytkownika. Zostanie również poinformowana java o użyciu aktualnie buforowanych biletów Protokołu Kerberos.

  • Zmodyfikuj następujący wiersz w pliku Java.Security :

    # Default login configuration file
    
    login.config.url.1=C:=\<Path to the File>\jaas.conf
    
  • Alternatywnie dodaj plik Jaas.conf za pomocą parametru podczas ładowania środowiska lub aplikacji. Upewnij się, że używasz tego samego parametru podczas kompilowania pliku Java:

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

Aby nawiązać połączenie z programem SQL Server przy użyciu zintegrowanego uwierzytelniania Kerberos, skonfiguruj plik Jaas.conf :

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

Parametry połączenia to String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;integratedSecurity=true;Domain=<MyyDomain>;trustServerCertificate=true;javaAuthentication=JavaKerberos;"

Przykładowy kod

Wszystkie sterowniki JDBC są dostarczane z przykładowym kodem w katalogu \sqljdbc_12.4\enu\samples . Najczęściej używanym elementem jest \ sqljdbc_12.4\enu\samples\connections\ConnectURR.java. Utwórz plik o nazwie ConnectURL.java lub użyj ConnectURL.java z przykładu dostarczonego ze sterownikiem.

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

Śledzenie sterowników JDBC

Ogólnie rzecz biorąc, zawsze chcemy ustawić śledzenie, aby FINEST uzyskać więcej szczegółów. Istnieją dwie metody śledzenia sterowników: włączanie śledzenia programowo i włączanie śledzenia przy użyciu pliku logging.properties.

Jeśli zdecydujesz się użyć pliku logging.properties , musisz znaleźć odpowiednie środowisko dla pliku logging.properties . $JAVA_HOME\conf\ i $JAVA_HOME\jre\lib to dwie możliwe lokalizacje.

Wykonaj następujące kroki, aby skonfigurować ten plik:

  1. Zmodyfikuj plik logging.properties , aby upewnić się, że jest on podobny do następujących właściwości globalnych:

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

    Programy obsługi informują język Java, gdzie mają być eksportowane dane wyjściowe. Istnieją dwie lokalizacje, w których program FileHandler zapisuje w pliku i program ConsoleHandler zapisuje w oknie konsoli. Dane wyjściowe będą generować dużo danych, więc należy je zapisać w pliku.

    • Wiersz komentarza

      #handlers= java.util.logging.ConsoleHandler
      
    • Wiersz komentarza

      handlers= java.util.logging.FileHandler
      

    Uwaga 16.

    Ustaw .level wartość i OFF nie zobaczysz komunikatów w oknie konsoli.

     .level=OFF
    
  2. Ustaw określone rejestrowanie programu obsługi plików:

    ############################################################
    # 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. Zmodyfikuj tę część, aby upewnić się, że jest podobna lub zawiera następujące wiersze:

    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. Zmodyfikuj java.util.logging.FileHandler.pattern = %h/java%u.log wiersz i zastąp %h/ ciąg ścieżką, którą plik ma być przechowywany. Na przykład:

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

  5. Ustaw poziom rejestrowania sterowników:

    Dodaj com.microsoft.sqlserver.jdbc.level=FINEST w dolnej części następującej sekcji:

    ############################################################
    # 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. Zapisz zmiany.

    Plik powinien wyglądać podobnie do następującego:

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

Po odtworzeniu błędu przywróć zmiany, aby zatrzymać tworzenie plików przez rejestrator.

Alternatywnie możesz utworzyć lub skopiować powyższy tekst, zapisać go w pliku i dodać plik do polecenia uruchamiania podczas ładowania aplikacji.

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

Dzięki temu można zidentyfikować plik logging.properties , który nie jest określony w katalogach domyślnych $JAVA_HOME\conf\ i $JAVA_HOME\jre\lib za pośrednictwem wiersza polecenia.

Zastrzeżenie dotyczące innych firm

Produkty innych firm omówione w tym artykule są wytwarzane przez producentów niezależnych od firmy Microsoft. Firma Microsoft nie udziela żadnych gwarancji, dorozumianych ani żadnego innego rodzaju, w odniesieniu do wydajności lub niezawodności tych produktów.