Поделиться через


Настройка И устранение неполадок JDBC

В этой статье описывается подключение к базе данных Java (JDBC) и действия по устранению неполадок, возникающие во время настройки. Основное внимание уделяется JDBC для SQL Server.

Примечание.

  • Эта статья основана на последнем драйвере JDBC (версия 12.4), установленном в корне диска C .
  • Корпорация Майкрософт не устраняет неполадки с подключениями JDBC, в которых существует сторонний диспетчер пулов подключений. Устранение неполадок с сторонним диспетчером пулов подключений может предоставить информацию о интеллектуальной собственности.

Драйвер Microsoft JDBC для SQL Server

В этой статье приведены справочные руководства по JDBC, включая драйвер и поддержку документации, инструкции по установке различных операционных систем (ОС) и устранение неполадок с подключением к SQL Server.

Изменения версии драйвера JDBC

Требования JDBC

  • Версия среды выполнения Java (JRE) должна соответствовать драйверу с версией JRE, указанной в имени. Например, для mssql-jdbc-9.4.1.jre8.jar требуется JRE 1.8, а для mssql-jdbc-9.4.1.jre11.jar требуется JRE 11.0.

  • CLASSPATH — это переменная среды Java, содержащая путь к каталогу и двоичные JAR-файлы. Java должен выполнить нужное приложение. Это требование указать, какой драйвер и двоичные jar-файлы зависимостей должны запускать Java. Минимальное значение CLASSPATH включает текущий рабочий каталог .; и расположение JAR-файла драйвера JDBC.

Действия по настройке и устранению неполадок JDBC

Установка переменной CLASSPATH

КЛАССPATH можно определить в переменной среды ОС или в самой среде приложения, например Tomcat. Если CLASSPATH он определен в среде приложения, поставщик приложений или разработчик должны быть вовлечены в работу, чтобы обеспечить правильность CLASSPATH конфигурации.

Чтобы задать CLASSPATH, используйте один из следующих методов:

Примечание.

Параметр командной строки является временным и будет удален при закрытии окна командной строки. Графический пользовательский интерфейс (GUI) является постоянным параметром и требует перезагрузки.

Пример командной строки

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

Пример графического интерфейса

Чтобы задать CLASSPATH использование графического интерфейса пользователя, выполните следующие действия.

  1. Откройте панель управления и выберите "Система и безопасность".

  2. Выберите параметры системы>advanced system.

  3. Выберите "Переменные>среды", а затем введите CLASSPATH в качестве имени переменной.

  4. Выберите "Изменить " и введите .; C:\sqljdbc_12.4\enu\mssql-jdbc-12.4.0.jre8.jar в качестве значения переменной.

  5. Нажмите кнопку ОК.

Строки подключения с переданными учетными данными

Строка подключения с переданными учетными данными ссылается на строка подключения, включающую учетные данные проверки подлинности (например, имя пользователя и пароль) в качестве параметров или значений в строке. При подключении программы к базе данных или другой службе необходимо предоставить сведения о проверке подлинности для установления безопасного подключения.

В следующем строка подключения показан пример подключения к базе данных SQL Server на основе режима проверки подлинности, который требуется использовать:

Проверка подлинности SQL Server

Строка подключения — String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MySQLAuthAccount>;password=<MyPassword>;trustServerCertificate=true;"

Проверка подлинности Windows AD без встроенной безопасности

Строка подключения — String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MyADAuthAccount>;password=<MyPassword>;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=NTLM"

Проверка подлинности Windows AD с помощью Kerberos и без встроенной безопасности

Строка подключения — String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;user=<MyADAuthAccount>;password=<MyPassword>;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=JavaKerberos"

Встроенное подключение NTLM

В этом типе подключения клиентский компьютер должен находиться в домене Windows.

Файл mssql-jdbc_auth-version-arch<>><.dll должен находиться в следующих путях:

  • 64-разрядная библиотека DLL

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

  • 32-разрядная библиотека DLL

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

Можно изменить и добавить путь или скопировать файл в уже установленный путь. Дополнительные сведения см. в статье "Подключение с интегрированной проверкой подлинности в Windows".

Строка подключения — String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;integratedSecurity=true;Domain=<MyDomain>;trustServerCertificate=true;javaAuthentication=NTLM"

Интегрированные подключения Kerberos

Необходимые условия для этого типа подключения:

  • Должен быть частью домена.
  • Должен быть установлен и настроен SSSD в ОС Linux.
  • Должен быть установлен и настроен Klist в ОС Linux.

Файл mssql-jdbc_auth-version-arch<>><.dll должен находиться в следующих путях. Можно изменить и добавить путь или скопировать файл в уже установленный путь.

  • 64-разрядная библиотека DLL

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

  • 32-разрядная библиотека DLL

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

Кроме того, необходимо создать файл Jaas.conf . По умолчанию этот файл не приходит с драйвером и не устанавливается с помощью Java. Чтобы помочь среде найти этот файл, используйте один из следующих методов:

Примечание.

Файл Jaas.conf позволит Java использовать текущий контекст пользователя, вошедшего в систему. Он также сообщит Java использовать кэшированные в настоящее время билеты Kerberos.

  • Измените следующую строку в файле Java.Security :

    # Default login configuration file
    
    login.config.url.1=C:=\<Path to the File>\jaas.conf
    
  • Кроме того, добавьте файл Jaas.conf через параметр при загрузке среды или приложения. Убедитесь, что при компиляции файла Java используется тот же параметр:

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

Чтобы установить подключение к SQL Server с помощью интегрированной проверки подлинности Kerberos, настройте файл Jaas.conf :

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

Строка подключения — String connectionUrl = "jdbc:sqlserver://<ServerName>:<PortNum>;integratedSecurity=true;Domain=<MyyDomain>;trustServerCertificate=true;javaAuthentication=JavaKerberos;"

Пример кода

Все драйверы JDBC приходят с примером кода в каталоге \sqljdbc_12.4\enu\samples . Наиболее часто используется в \sqljdbc_12.4\enu\samples\connections\ConnectURR.java. Создайте файл с именем ConnectURL.java или используйте ConnectURL.java из примера, предоставленного драйвером.

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

Как правило, мы всегда хотим задать трассировку FINEST для получения дополнительных сведений. Существует два метода трассировки драйверов: включение трассировки программным способом и включение трассировки с помощью файла logging.properties.

Если вы решили использовать файл logging.properties, необходимо найти правильную среду для файла logging.properties. $JAVA_HOME\conf\ и $JAVA_HOME\jre\lib — это два возможных расположения.

Выполните следующие действия, чтобы настроить этот файл:

  1. Измените файл logging.properties , чтобы убедиться, что он похож на следующие глобальные свойства:

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

    Обработчики сообщают Java, где экспортировать выходные данные. В окне консоли выполняется запись FileHandler в файл, а ConsoleHandler записывается в окно консоли. Выходные данные будут создавать большое количество данных, поэтому его необходимо записать в файл.

    • Строка комментариев

      #handlers= java.util.logging.ConsoleHandler
      
    • Раскомментируйте строку

      handlers= java.util.logging.FileHandler
      

    Примечание.

    Установите значение .level OFF и вы не увидите сообщения в окне консоли.

     .level=OFF
    
  2. Задайте определенное ведение журнала FileHandler:

    ############################################################
    # 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. Измените эту часть, чтобы убедиться, что она похожа или содержит следующие строки:

    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. Измените java.util.logging.FileHandler.pattern = %h/java%u.log строку и замените %h/ путь, который требуется сохранить файл. Например:

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

  5. Задайте уровень ведения журнала драйверов:

    Добавьте com.microsoft.sqlserver.jdbc.level=FINEST в нижней части следующего раздела:

    ############################################################
    # 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. Сохраните изменения.

    Файл должен выглядеть следующим образом:

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

После воспроизведения ошибки верните изменения, чтобы остановить создание файлов средства ведения журнала.

Кроме того, можно создать или скопировать приведенный выше текст, сохранить его в файл и добавить его в команду запуска при загрузке приложения.

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

Это позволит определить файл logging.properties , который не указан в каталогах $JAVA_HOME\conf\ по умолчанию и $JAVA_HOME\jre\lib с помощью командной строки.

Заявление об отказе от ответственности за сведения о продуктах сторонних производителей

В этой статье упомянуты программные продукты независимых производителей. Корпорация Майкрософт не дает никаких гарантий, подразумеваемых и прочих, относительно производительности и надежности этих продуктов.