I/O错误:SSO失败:未加载本机SSPI库

Nos*_*een 31 java sql-server jdbc ioerror

我正在尝试运行以下代码:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的SQL服务器在机器BHX上的端口1433上运行.

我得到的错误信息如下:

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
Run Code Online (Sandbox Code Playgroud)

我已经阅读了为什么这种情况经常发生并在这里发现了类似的问题,但这似乎不起作用.运行代码时,我已经包含以下参数来查找SSO文件:

-Djava.library.path=/Tester/jdbc/x64/SSO
Run Code Online (Sandbox Code Playgroud)

这是我的文件的结构

**Tester**
   *src*
     default package
         Connect.java
   *JRE System Library*
   *jdbc*
     conf
     html
     IA64
     x64
       SSO
        ntlmauth.dll
     x86
Run Code Online (Sandbox Code Playgroud)

你能发现什么错吗?

Rob*_*mar 64

看起来像这个问题一样: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机器上运行:

  • 这个32位DLL:

    下载>>> jtds-1.3.0-dist.zip >>> x86 >>> SSO >>> ntlmauth.dll

  • 在这个32位JRE位置到这里:

    C:\ Program Files\Java\jre7\bin

如果这不起作用,请尝试在main方法的顶部添加此行: System.out.println(java.lang.System.getProperty('java.library.path'));

它应该输出程序使用的实际JRE路径.确保相应的ntlmauth.dll位于该JRE的bin文件夹中.

注意:使用此方法时,请勿设置连接的域,用户或密码属性.

注意:如果您的Java客户端程序在非Windows机器上运行,那么使用ntlmauth.dll方法是不合时宜的.这是JTDS下载包附带的文档中的引用:下载>>> jtds-1.3.0-dist.zip >>> README.SSO

从版本0.9.2开始,jTDS能够使用运行客户端程序的帐户下的当前用户的Windows凭据登录到SQL Server(Windows Single Sign On).

使用Windows Single Sign On(SSO)客户端将能够在不提供凭据的情况下连接到Microsoft SQL Server.它将动态读取当前用户的凭据并连接到数据库.前提是Windows帐户在数据库中具有足够的权限.这是使用本机(仅限Windows)库ntlmauth.dll完成的.


cod*_*nob 6

我有一个类似的问题,我试图将ntlmauth.dll文件放在尽可能多的目录中,我认为sql-developer会去寻找它.我终于通过将ntlmauth.dll文件放在\jdk\jre\binsql-developer应用程序目录本身的文件夹中来实现它(即sql-developer\jdk\jre\bin).为什么sql-developer会在这个文件夹中查找ntlmauth.dll,而不是系统文件夹超出我的理解水平.无论如何,它奏效了.

以下是我刚才回答的类似问题的链接.

Oracle SQL Developer与Microsoft SQL Server的连接


小智 6

即使成功将 ntmauth.dll 文件放入 JRE/bin 中,我也会遇到相同的错误。

然后我尝试放入目录ntmauth.dllC:\Windows\System32。通过这样做,问题得到了解决。