我正在尝试通过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连接URL(都给了我与上面相同的错误):
"jdbc:jtds:sqlserver://PHSSQL792:1433"
"jdbc:jtds:sqlserver://PHSSQL792:1433/pacsdb"
"jdbc:jtds:sqlserver://PHSSQL792:1433/pacsdb;instance=PHSSQL792"
相应的Microsoft URLS(均有效):
"jdbc:sqlserver://PHSSQL792:1433"
"jdbc:sqlserver://PHSSQL792:1433;databasename=pacsdb"
"jdbc:sqlserver://PHSSQL792\\PHSSQL792:1433;databasename=pacsdb"
另外,我可以使用jTDS驱动程序成功连接到其他SQL Server 2008 R2数据库(在其他服务器上),因此它不是jar。
万一有人碰到这个问题,我会在很久以后再回到这个问题上,最后找出问题所在。有问题的SQL Server实例已配置为需要SSL连接!我只是添加ssl=request
到URL使其起作用。
我认为Microsoft驱动程序在未显式设置SSL加密的情况下工作的原因是它始终始终与SSL连接以对登录的用户名/密码进行加密。该encrypt
属性仅控制登录后的数据是否被加密。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句