You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java连接Docker部署的MS SQL数据库报错求助

问题描述

我在Mac上通过Docker安装并配置了MS SQL,服务器已正常运行,但使用Java代码连接时出现通信链接失败错误。已导入mysql-connector-java-5.1.25.jar,使用Eclipse IDE。

连接代码

import java.sql.*;
import javax.swing.*;

public class DBConnectTrial1 {
  public static void main(String[] args) {
    try {
      String driver = "com.mysql.jdbc.Driver";
      String url =
          "jdbc:mysql://localhost:3306/mssql_trial?enabledTLSProtocols=TLSv1.2";
      String username = "sa";
      String password = "DB_Password";

      Class.forName(driver);

      Connection conn = DriverManager.getConnection(url, username, password);

      System.out.println("Connection established");
    }

    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

异常信息

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:357)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2479)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2516)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2301)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:346)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230)
    at DBConnectTrial1.main(DBConnectTrial1.java:19)
Caused by: java.net.ConnectException: Connection refused
    at java.base/sun.nio.ch.Net.connect0(Native Method)
    at java.base/sun.nio.ch.Net.connect(Net.java:589)
    at java.base/sun.nio.ch.Net.connect(Net.java:578)
    at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:583)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
    at java.base/java.net.Socket.connect(Socket.java:751)
    at java.base/java.net.Socket.connect(Socket.java:686)
    at java.base/java.net.Socket.<init>(Socket.java:555)
    at java.base/java.net.Socket.<init>(Socket.java:356)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:259)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:307)
    ... 14 more
问题排查与解决

核心错误是用MySQL的JDBC驱动连接MS SQL Server,两种数据库的驱动、连接协议完全不匹配,导致连接失败。以下是具体修正步骤:

1. 替换JDBC驱动

移除当前的mysql-connector-java-5.1.25.jar,改用MS SQL Server官方JDBC驱动(如mssql-jdbc)。可下载对应版本的jar包导入Eclipse项目,或通过Maven依赖引入。

2. 修改连接参数

驱动类名

将MySQL驱动类替换为MS SQL的官方驱动类:

String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

(JDBC 4.0+版本可省略Class.forName(driver),驱动会自动注册)

JDBC URL格式

MS SQL的URL格式与MySQL差异极大,正确格式示例:

String url = "jdbc:sqlserver://localhost:1433;databaseName=mssql_trial;encrypt=true;trustServerCertificate=true";
  • 端口说明:MS SQL默认端口为1433,不是MySQL的3306,需确认Docker容器是否映射了1433端口
  • encrypt=true与trustServerCertificate=true:解决本地Docker环境下的SSL证书验证问题
  • databaseName:指定要连接的目标数据库名称

修正后的完整代码

import java.sql.*;

public class DBConnectTrial1 {
  public static void main(String[] args) {
    try {
      String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
      String url = "jdbc:sqlserver://localhost:1433;databaseName=mssql_trial;encrypt=true;trustServerCertificate=true";
      String username = "sa";
      String password = "DB_Password";

      // JDBC 4.0+可省略此行
      Class.forName(driver);

      Connection conn = DriverManager.getConnection(url, username, password);
      System.out.println("Connection established");
      conn.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

3. 额外检查点

  • 确认Docker端口映射:运行docker ps查看容器端口映射,确保1433端口已映射到本地(如0.0.0.0:1433->1433/tcp)
  • 验证sa账号:确保账号密码正确,且MS SQL已启用SQL Server身份验证模式
  • 驱动依赖:确认Eclipse项目已正确添加MS SQL JDBC驱动的依赖

内容的提问来源于stack exchange,提问作者user434853

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:39:53