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
相关产品推荐
相关产品推荐

