2014-03-05 385 views
0

我試圖通過Java連接到SQL Server 2008 R2,並且我無法使用jTDS 1.2.8來這樣做。奇怪的是,它使用Microsoft JDBC驅動程序可以正常工作。是否需要打開一些服務器端設置才能使jTDS訪問它?或者我只是在URL中丟失了一些東西?我不使用Windows集成身份驗證指定憑據,我也沒有嘗試使用SSL加密連接無法使用jTDS連接到SQL Server

(這些都是我發現可以生成我看到異常的問題。)

如果我使用與微軟的驅動程序之後,它按預期工作,我也沒有任何問題訪問數據庫:

Connection connection = DriverManager.getConnection("jdbc:sqlserver://PHSSQL792\\PHSSQL792:1433", user, password); 

userpassword是早先聲明的變量,所以我可以肯定有連接,當我使用相同的值或者驅動程序。)

但是,如果我用了JTDS驅動程序如下:

Connection connection = DriverManager.getConnection("jdbc:jtds:sqlserver://PHSSQL792:1433;instance=PHSSQL792", user, password); 

我得到以下錯誤:

java.sql.SQLException: I/O Error: DB server closed connection. 
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2387) 
    at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:614) 
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:356) 
    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(DriverManager.java:571) 
    at java.sql.DriverManager.getConnection(DriverManager.java:215) 
    at database.db_access.SqlServerDatabaseTestApp.main(SqlServerDatabaseTestApp.java:28) 
Caused by: java.io.IOException: DB server closed connection. 
    at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:853) 
    at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java:732) 
    at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.java:477) 
    at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:114) 
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2281) 
    at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:614) 
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:356) 
    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(DriverManager.java:571) 
    at java.sql.DriverManager.getConnection(DriverManager.java:215) 
    at database.db_access.SqlServerDatabaseTestApp.main(SqlServerDatabaseTestApp.java:28) 

我已經試過與不數據庫名稱連接,和/或帶/不帶實例名稱,並得到相同的結果。有什麼建議麼?

編輯:

其他JTDS連接的URL我已經試過(全部給了我上述同樣的錯誤):

"jdbc:jtds:sqlserver://PHSSQL792:1433" 
"jdbc:jtds:sqlserver://PHSSQL792:1433/pacsdb" 
"jdbc:jtds:sqlserver://PHSSQL792:1433/pacsdb;instance=PHSSQL792" 

相應的Microsoft URL(所有工作):

"jdbc:sqlserver://PHSSQL792:1433" 
"jdbc:sqlserver://PHSSQL792:1433;databasename=pacsdb" 
"jdbc:sqlserver://PHSSQL792\\PHSSQL792:1433;databasename=pacsdb" 

此外,我可以使用jTDS驅動程序成功連接到不同的SQL Server 2008 R2數據庫(在不同的服務器上)所以它不是罐子。

回答

0

如果有誰運行到這一點,我回到了這麼多以後,終於想通了這個問題。有問題的SQL Server實例被配置爲需要SSL連接!我只是將ssl=request添加到網址以使其正常工作。

我認爲微軟驅動程序沒有明確設置SSL加密的原因是它最初連接到SSL加密用戶名/密碼登錄。 encrypt屬性僅控制登錄後的數據是否加密。

0

下面是我們使用的是看起來非常接近你的格式,:

jdbc:jtds:sqlserver://localhost:1433/Dev_DB;tds=8.0;lastupdatecount=true 
-1
String driver="net.sourceforge.jtds.jdbc.Driver"; 
Class.forName(driver).newInstance(); 
//First way 
String connString="jdbc:jtds:sqlserver://192.168.1.123:1433/database_name;encrypt=false;user=sa;password=mypass;"; 
String username="sa"; 
String password="mypass"; 
Connection con=DriverManager.getConnection(connString,username,password); 

//Second way 
String connString="jdbc:jtds:sqlserver://127.0.0.1:1433/database_name;encrypt=false;user=sa;password=mypass;integratedSecurity=true;instance=SQLEXPRESS;"; 
String username="sa"; 
String password="mypass"; 
Connection con=DriverManager.getConnection(connString,username,password); 
+1

簡單地粘貼代碼並不被認爲是一個好的答案。雖然這可能是正確的,但它不會幫助OP瞭解他們的問題或解決方案。 – leigero

0

很奇怪,你的連接字符串看起來是正確的。嘗試直接設置用戶名和密碼:

"jdbc:jtds:sqlserver://PHSSQL792:1433/pacsdb;instance=PHSSQL792;user=sa;password=pass" 
+0

謝謝,我也試過,但它也沒有工作。我認爲它必須是我錯過的一些驅動程序設置,而不是URL問題。最後,我放棄了,並與微軟的驅動程序。 – cmolodo