我正在尝试通过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);
(user
和password
是先前声明的变量,因此我可以确定在连接任何一个驱动程序时使用相同的值。)
但是,如果我将以下内容与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。
答案 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);