如何通过 JDBC 在 Java 中正确连接 SQL Server 数据库

本文详解 java 应用通过 microsoft jdbc driver 连接本地 sql server 的完整流程,涵盖连接字符串构造、实例名验证、sql server browser 服务配置、防火墙设置及常见超时错误的排查方法。

在 Java 中连接 SQL Server 数据库,核心依赖于官方提供的 Microsoft JDBC Driver for SQL Server(需显式添加 JAR 或通过 Maven 引入),但仅引入驱动远远不够——连接失败(如 SocketTimeoutException: Receive timed out)往往源于底层网络与 SQL Server 实例配置问题,而非代码逻辑错误。

✅ 正确的连接字符串格式

您当前使用的 URL:

String url = "jdbc:sqlserver://LAPTOP-0CSKUFIE\\MSSQLSERVER;databaseName=datatreck";

存在两个关键隐患:

  1. 未指定端口:默认命名实例(如 MSSQLSERVER)通常监听 TCP 端口 1433,但 JDBC 驱动在未显式指定端口时,会尝试通过 UDP 1434 端口向 SQL Server Browser 服务查询动态端口——这正是报错中 port 1434 和 SQL Server Browser is not running 的根源;
  2. 主机名可靠性低:LAPTOP-0CSKUFIE 是 NetBIOS 名称,可能受 DNS/LMHOSTS 解析影响;本地开发推荐统一使用 localhost 或 127.0.0.1。

✅ 推荐写法(显式端口 + 可靠主机):

String url = "jdbc:sqlserver://localhost:1433;databaseName=datatreck;encrypt=false;trustServerCertificate=true;";
// 注意:SQL Server 2019+ 默认启用加密,若未配置证书,必须添加 encrypt=false & trustServerCertificate=true
? 如何确认 SQL Server 实例是否真正在监听 1433? 打开 SQL Server 配置管理器 → 展开 SQL Server 网络配置 → 选择您的实例(如 MSSQLSERVER 的协议)→ 右键 TCP/IP → 属性 → 切换到 IP 地址 选项卡 → 检查 IPAll 下的 TCP 端口 是否为 1433(若为空,则需手动填入并重启 SQL Server 服务)。

⚙️ 必须检查的 SQL Server 服务状态

  • SQL Server (MSSQLSERVER):主数据库引擎服务(必须“正在运行”)
  • ⚠️ SQL Server Browser:仅当使用命名实例(如 \\SQLEXPRESS)且未指定端口时才需要;对于默认实例 MSSQLSERVER,可禁用该服务,只要连接字符串中明确指定 :1433 即可规避对它的依赖。

? 小技巧:在 Windows 搜索栏输入 services.msc → 查找以上两项服务 → 右键“启动”并设为“自动(延迟启动)”。

?️ 防火墙与网络策略

即使服务已启动,Windows 防火墙仍可能拦截:

  • 允许 入站规则:TCP 端口 1433(非 UDP 1434!)
  • 若使用命名实例且坚持不指定端口,则还需放行 UDP 端口 1434 并确保 SQL Server Browser 运行。

可通过命令快速验证端口连通性:

telnet localhost 1433
# 若提示“无法打开到主机的连接”,说明端口未开放或 SQL Server 未监听

? JDBC 驱动依赖(Maven 示例)

确保项目中已引入最新稳定版驱动(推荐 12.6.1.jre11 或适配 JDK 版本):


    com.microsoft.sqlserver
    mssql-jdbc
    12.6.1.jre11
    runtime

✅ 完整可运行示例(含异常增强提示)

import java.sql.*;

public class JvaConnect2SQL {
    public static void main(String[] args) {
        String url = "jdbc:sqlserver://localhost:1433;databaseName=datatreck;encrypt=false;trustServerCertificate=true;";
        String username = "sa";
        String password = "hello";

        try (Connection conn = DriverManager.getConnection(url, username, password)) {
            System.out.println("✅ 成功连接到 SQL Server!当前数据库:" + conn.getCatalog());
            try (Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery("SELECT @@VERSION AS version")) {
                if (rs.next()) {
                    System.out.println("SQL Server 版本:" + rs.getString("version"));

} } } catch (SQLException e) { System.err.println("❌ 连接失败:" + e.getMessage()); // 关键诊断信息 System.err.println("SQLState: " + e.getSQLState()); System.err.println("Error Code: " + e.getErrorCode()); e.printStackTrace(); } } }

? 总结:5 步快速排障清单

步骤 检查项 工具/方法
1️⃣ SQL Server 实例是否运行? services.msc → 查看 SQL Server (MSSQLSERVER) 状态
2️⃣ TCP 1433 端口是否启用并监听? SQL Server 配置管理器 → TCP/IP 属性 → IPAll → TCP 端口 = 1433
3️⃣ 本地能否 telnet 通? telnet localhost 1433(若失败,检查防火墙或实例配置)
4️⃣ 连接字符串是否显式指定 :1433? 避免依赖 SQL Server Browser,禁用其亦无妨
5️⃣ JDBC 驱动版本与 JDK 兼容? 使用 mssql-jdbc 官方最新版,匹配 JDK 主版本

遵循以上步骤,95% 的“连接超时”问题可立即定位并解决。记住:JDBC 连接失败,80% 是 SQL Server 侧配置问题,而非 Java 代码缺陷。