Ошибка ввода-вывода: ошибка SSO: не загружена собственная библиотека SSPI
Я пытаюсь запустить следующий бит кода:
import java.sql.DriverManager;
public class Connect {
public static void main(String[] args){
try{
String databaseDriver = "net.sourceforge.jtds.jdbc.Driver";
Class.forName(databaseDriver);
}
catch (Exception e) {
e.printStackTrace();
}
try{
String url = "jdbc:jtds:sqlserver://BHX:1433/Forecast;instance=SQLEPXRESS";
java.sql.Connection con = DriverManager.getConnection(url);
System.out.println("Connection");
}
catch (Exception e){
e.printStackTrace();
}
}
}
Мой SQL-сервер работает на порту 1433 на машине BHX.
Сообщение об ошибке, которое я получаю, выглядит следующим образом:
java.sql.SQLException: I/O Error: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property.
at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:615)
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:352)
at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:185)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at Connect.main(Connect.java:14)
Caused by: java.io.IOException: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property.
at net.sourceforge.jtds.jdbc.TdsCore.sendMSLoginPkt(TdsCore.java:1893)
at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:588)
... 6 more
Я прочитал, почему это обычно происходит и нашло аналогичный вопрос здесь, но это, похоже, не работает. При запуске кода я обнаружил следующий аргумент для поиска файла SSO:
-Djava.library.path=/Tester/jdbc/x64/SSO
И это структура моих файлов
**Tester**
*src*
default package
Connect.java
*JRE System Library*
*jdbc*
conf
html
IA64
x64
SSO
ntlmauth.dll
x86
Вы можете обнаружить что-то не так?
Ответы
Ответ 1
Похоже на ту же проблему, что и эта: jtds-driver-not-working-for-sql-sever-2008r2-and-denali-native-sspi-library-not
Вы должны вынуть соответствующий файл ntlmauth.dll из пакета загрузки JTDS в папку JRE bin.
Если вы работаете на 64-битной машине Windows:
-
Эта 32-разрядная DLL:
Загрузка → > jtds-1.3.0-dist.zip → > x86 → > SSO → > ntlmauth.dll
-
Идет здесь, в этом 32-битном месте JRE:
C:\Program Files (x86)\Java\jre7\bin
-
Эта 64-битная DLL:
Загрузка → > jtds-1.3.0-dist.zip → > x64 → > SSO → > ntlmauth.dll
-
Идет здесь, в этом 64-битном месте JRE:
C:\Program Files\Java\jre7\bin
Если вы работаете на 32-битной машине Windows:
Если это не сработает, попробуйте добавить эту строку вверху вашего основного метода:
System.out.println(java.lang.System.getProperty('java.library.path'));
Он должен выводить фактический путь JRE, используемый вашей программой. Убедитесь, что соответствующий файл ntlmauth.dll находится в папке JRE bin.
ПРИМЕЧАНИЕ. НЕ устанавливайте свойства подключения к домену, пользователю или паролю при использовании этого метода.
ПРИМЕЧАНИЕ. Если ваша клиентская программа Java работает на машине без окон, вам не повезло с использованием метода ntlmauth.dll. Это цитата из документации, прилагаемой к пакету загрузки JTDS: Загрузки → > jtds-1.3.0-dist.zip → > README.SSO
Начиная с версии 0.9.2 jTDS может использовать Windows учетные данные текущего пользователя, под учетной записью которого клиентская программа запуск для входа в SQL Server (одноранговый вход Windows).
С помощью Windows Single Sign On (SSO) клиенты смогут подключаться к Microsoft SQL Server без предоставления учетных данных. Это было бы динамично читать текущие учетные данные пользователя и подключаться к базе данных. при условии, что учетная запись Windows имеет достаточные права в базе данных. Это делается с использованием (только для Windows), ntlmauth.dll.
Ответ 2
У меня была аналогичная проблема, и я попытался поместить файл ntlmauth.dll
в столько директорий, которые, как я думал, sql-developer будет искать его. Я, наконец, получил его, чтобы поместить файл ntlmauth.dll
в папку \jdk\jre\bin
в самом каталоге приложения sql-разработчика (т.е. sql-developer\jdk\jre\bin
). Почему sql-разработчик ищет ntlmauth.dll в этой папке, а не системную папку выходит за рамки моего понимания. В любом случае, это сработало.
Ниже приведена ссылка на аналогичный вопрос, на который я только что ответил.
Соединение Oracle SQL Developer с Microsoft SQL Server
Ответ 3
Хорошая работа.
Но при развертывании JAR файла возникла небольшая проблема!
Я предлагаю создать папку (например, lib
) и скопировать все собственные библиотеки. Наконец добавьте параметр выполнения Java:
java -jar your_jar.jar -Djava.library.path=./lib
Это было вдохновлено драйвером JTDS, который не работает для SQL Server 2008R2 и Denial Native SSPI-библиотека не загружена.
Ответ 4
Неспособность пройти аутентификационные параметры приводит к той же ошибке, поэтому в качестве альтернативы другим ответам вы также можете передать имя пользователя и пароль в строке соединения, например.
jdbc:jtds:sqlserver://localhost:1433/dbname;user=username;password=s3cr3t
Ответ 5
Я получаю ту же ошибку даже после успешного размещения файла ntmauth.dll в JRE/bin.
Затем я попытался установить ntmauth.dll в каталог sysmtem32. При этом проблема была исправлена.
Ответ 6
Я начал работать, поместив файл ntlmauth.dll
в \jdk\jre\bin
. Я использую Tomcat в качестве моего сервера приложений.
Однако я заметил, что это работает только для одного веб-приложения, развернутого за раз. Если у меня одинаковые настройки для нескольких веб-приложений, все не работают, но одно. Это довольно странное поведение. Любая идея, что происходит здесь?