【问题标题】:Can't connect to SQL Server using jTDS无法使用 jTDS 连接到 SQL Server
【发布时间】:2014-04-07 20:13:56
【问题描述】:

我正在尝试通过 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 连接 URL(都给了我与上面相同的错误):

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

对应的微软网址(都有效):

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

另外,我可以使用 jTDS 驱动程序成功连接到不同的 SQL Server 2008 R2 数据库(在不同的服务器上),所以它不是 jar。

【问题讨论】:

    标签: java sql-server jdbc jtds


    【解决方案1】:

    万一有人遇到这个问题,我很晚才回来,终于找到了问题所在。有问题的 SQL Server 实例被配置为需要 SSL 连接!我刚刚在 URL 中添加了ssl=request 以使其正常工作。

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

    【讨论】:

    • 此更改也适用于让 jtds 1.3.1 连接到 SQL Server 2017
    【解决方案2】:

    这是我们使用的格式,看起来非常接近您的:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 谢谢,我也试过了,还是不行。我认为这一定是我缺少的一些驱动程序设置,而不是 URL 问题。最后我还是放弃了,改用微软驱动。
      【解决方案4】:
      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);
      

      【讨论】:

      • 简单地粘贴代码并不是一个好的答案。虽然这可能是正确的,但它并不能帮助 OP 了解他们的问题或您的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      相关资源
      最近更新 更多