无法使用jTDS连接到SQL Server

时间:2014-03-05 16:24:59

标签: java sql-server jdbc jtds

我正在尝试通过Java连接到SQL Server 2008 R2,而我无法使用jTDS 1.2.8这样做。奇怪的是,使用Microsoft JDBC驱动程序可以正常工作。是否需要打开一些服务器端设置以使jTDS能够访问它?或者我只是遗漏了URL中的内容?

我没有使用Windows集成身份验证来指定凭据,我也没有尝试使用SSL加密进行连接(这些是我发现可以生成我看到的异常的问题。)

如果我使用以下Microsoft驱动程序,它按预期工作,我可以访问数据库没有问题:

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连接网址(这些都给了我与上面相同的错误):

"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数据库(在不同的服务器上),因此它不是jar。

4 个答案:

答案 0 :(得分:0)

以下是我们使用的格式,它与您的格式非常接近:

jdbc:jtds:sqlserver://localhost:1433/Dev_DB;tds=8.0;lastupdatecount=true

答案 1 :(得分:0)

奇怪的是,你的连接字符串看起来是正确的。尝试直接设置用户和密码:

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

答案 2 :(得分:0)

如果有人遇到这种情况,我后来回到这一点,最后找出问题所在。有问题的SQL Server实例配置为需要SSL连接!我刚刚在网址中添加了ssl=request以使其正常运行。

我认为Microsoft驱动程序在没有明确设置SSL加密的情况下工作的原因是总是最初与SSL连接以加密用户名/密码以进行登录。 encrypt属性仅控制登录后的数据是否加密。

答案 3 :(得分:-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);