私は次のコードを実行しようとしています:
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サーバーはマシン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
私はこれが通常起こる理由を読んで、同様の質問 here を見つけましたが、これはうまくいかないようです。コードを実行するときに、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
何か間違いを見つけられますか?
これと同じ問題のようです: 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
それでもうまくいかない場合は、メインメソッドの先頭に次の行を追加してみてください: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シングルサインオン)にログインできます。
Windowsシングルサインオン(SSO)クライアントを使用すると、資格情報を提供せずにMicrosoft SQL Serverに接続できます。現在のユーザーの資格情報を動的に読み取り、データベースに接続します。 Windowsアカウントがデータベースに対して十分な権限を持っている場合に限ります。これは、ネイティブ(Windowsのみ)ライブラリntlmauth.dllを使用して行われます。
同様の問題が発生したため、ntlmauth.dll
ファイルをできるだけ多くのディレクトリに配置し、sql-developerがそれを探しに行くと思いました。私はついにntlmauth.dll
ファイルの\jdk\jre\bin
sql-developerアプリケーションディレクトリ自体のフォルダー(つまり、sql-developer\jdk\jre\bin
)。なぜsql-developerは、システムフォルダーではなく、このフォルダー内でntlmauth.dllを探すのかは、私の理解レベルを超えています。いずれにせよ、それは働いた。
以下は、私がちょうど答えた同様の質問へのリンクです。
Ntmauth.dllファイルをJRE/binに正常に配置した後でも、同じエラーが発生します。
次に、ntmauth.dll
の中に C:\Windows\System32
ディレクトリ。そうすることで、問題は修正されました。
よくやった。
しかし、JARファイルをデプロイする際には少し問題があります!
フォルダー(たとえば、lib
)を作成し、すべてのネイティブライブラリをコピーすることをお勧めします。最後に、Java実行パラメーター)を追加します。
Java -jar your_jar.jar -Djava.library.path=./lib
これは、JTDSドライバーがSQL Server 2008R2で機能せず、Denali Native SSPIライブラリがロードされないから着想を得たものです。
認証パラメータを渡さないと同じエラーが発生するため、他の回答の代わりに、接続文字列でユーザー名とパスワードを渡すこともできます。
jdbc:jtds:sqlserver://localhost:1433/dbname;user=username;password=s3cr3t
ntlmauth.dll
のファイル\jdk\jre\bin
。アプリケーションサーバーとして Tomcat を使用しています。
しかし、これは一度にデプロイされた1つのWebアプリケーションに対してのみ機能することに気付きました。複数のWebアプリケーションに同じ設定がある場合、1つを除いてすべて失敗します。これは非常に奇妙な動作です。ここで何が起こっているのでしょうか?