I/O错误: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 Server在机器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

我已经阅读了为什么通常会发生这种情况并在这里找到类似的问题,但这似乎不起作用。运行代码时,我插入了以下参数以找到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

您可以发现任何错误吗?

似乎与这个问题一样:>

您应该将适当的ntlmauth.dll文件从JTDS下载软件包中删除到JRE bin文件夹中。

如果您在64位Windows机器上运行:

  • 这个32位DLL:

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

  • 在此32bit JRE位置去这里:

    c: program文件(x86) java jre7 bin

  • 这个64位DLL:

    下载>>> jtds-1.3.0-dist.zip>>> x64>>> sso>>> ntlmauth.dll

  • 在此64位JRE位置去这里:

    c: program文件 java jre7 bin

如果您在32位Windows机器上运行:

  • 这个32位DLL:

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

  • 在此32bit JRE位置去这里:

    c: program文件 java jre7 bin

如果那不起作用,请尝试在主要方法的顶部添加此行: 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 JTD开始使用Windows 当前用户的凭据在其帐户中客户程序为 运行登录到SQL Server(Windows单登录)。

使用Windows单登录ON(SSO)客户端将能够连接到 Microsoft SQL Server而无需提供凭据。它会动态 阅读当前用户的凭据并连接到数据库。提供了 Windows帐户在数据库中具有足够的权利。这是使用 本机(仅Windows)库,ntlmauth.dll。

我也有一个类似的问题,我试图将ntlmauth.dll文件放在我认为SQL-Developer的许多目录中,都会寻找它。我终于通过将ntlmauth.dll文件放在SQL-Developer应用程序目录本身(即sql-developerjdkjrebin)中的jdkjrebin文件夹中来工作。为什么SQL-Developer会在此文件夹中查找ntlmauth.dll,而不是系统文件夹超出了我的理解水平。无论如何,它有效。

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

Oracle SQL开发人员连接到Microsoft SQL Server

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

然后,我尝试将ntmauth.dll放入C:WindowsSystem32目录中。通过这样做,问题已解决。

无法传递身份验证参数会导致相同的错误,因此,与其他答案相比,您也可以在连接字符串中传递用户名和密码,例如。

jdbc:jtds:sqlserver://localhost:1433/dbname;user=username;password=s3cr3t

好工作。

但是,部署罐子文件时有一个问题!

我建议创建一个文件夹(例如lib),然后复制所有本机库。最后添加Java执行参数:

java -jar your_jar.jar -Djava.library.path=./lib

这是从 jtds驱动程序中的灵感来源的

我通过将ntlmauth.dll文件放置在jdkjrebin上来使其工作。我正在使用tomcat作为我的应用程序服务器。

但是,我注意到这仅适用于一次部署的一个Web应用程序。如果我为多个Web应用程序设置相同的设置,那么所有这些设置都失败了。这是一个非常奇怪的行为。知道这里发生了什么?

最新更新