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

Java 17 Spring Boot连接MS SQL Server登录失败排查求助

Spring Boot 17连接MS SQL Server登录失败问题排查

环境配置

依赖项

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>10.2.1.jre17</version>
</dependency>
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc_auth</artifactId>
    <version>10.2.1.x86</version>
    <type>dll</type>
</dependency>

application.properties配置

spring.datasource.url=jdbc:sqlserver://domain.name;databaseName=DBNAME;
spring.datasource.username=ORGANIZATION\\username
spring.datasource.password=password

定时任务查询代码

@Scheduled(fixedRate = 100000)
public void doAFlip() {
    Map<String, Object> m = template.queryForMap("SELECT 1");
    System.out.println(m);
}

错误信息

org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user 'ORGANIZATION\username'. ClientConnectionId:53139a88-ea29-4a7e-a576-10a1a91131be
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:83) ~[spring-jdbc-5.3.21.jar!/:5.3.21]
    ...

补充说明

已确认凭据正确,相同信息可在Go中正常连接,Go连接字符串:

server=domain.name;user id=ORGANIZATION\\username;password=password;port=1433;database=DBNAME;

解决方案

1. 处理身份验证模式冲突

引入的mssql-jdbc_auth依赖用于Windows集成身份验证,但当前使用SQL Server账号密码登录,两者可能存在冲突:

  • 直接移除mssql-jdbc_auth依赖,避免集成验证逻辑干扰账号密码登录;
  • 若必须保留该依赖,需在JDBC URL中明确指定身份验证模式:
    spring.datasource.url=jdbc:sqlserver://domain.name;databaseName=DBNAME;authentication=SqlPassword;
    

2. 调整用户名传递方式

尝试将用户名和密码直接嵌入JDBC URL,绕过Spring Boot配置文件的解析逻辑:

spring.datasource.url=jdbc:sqlserver://domain.name:1433;databaseName=DBNAME;user=ORGANIZATION\\username;password=password;
# 注释掉以下两行
# spring.datasource.username=ORGANIZATION\\username
# spring.datasource.password=password

3. 显式指定端口

Go连接字符串指定了port=1433,Java JDBC默认端口虽为1433,但显式添加可避免潜在的端口解析问题:

spring.datasource.url=jdbc:sqlserver://domain.name:1433;databaseName=DBNAME;

4. 升级JDBC驱动版本

当前使用的mssql-jdbc 10.2.1.jre17虽适配Java 17,但可能存在兼容性问题,尝试升级到最新稳定版(如12.4.2.jre17):

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>12.4.2.jre17</version>
</dependency>

调试方法

1. 开启JDBC驱动日志

在application.properties中添加日志配置,获取连接过程的详细信息:

logging.level.com.microsoft.sqlserver.jdbc=DEBUG
logging.level.com.microsoft.sqlserver.jdbc.internals=TRACE

日志会输出驱动发送的身份验证请求细节,帮助定位问题根源。

2. 测试原生JDBC连接

编写独立的JDBC测试代码,排除Spring Boot自动配置的影响:

import java.sql.Connection;
import java.sql.DriverManager;

public class JdbcConnectionTest {
    public static void main(String[] args) {
        try {
            String url = "jdbc:sqlserver://domain.name:1433;databaseName=DBNAME;authentication=SqlPassword";
            String user = "ORGANIZATION\\username";
            String password = "password";
            Connection conn = DriverManager.getConnection(url, user, password);
            System.out.println("连接成功");
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 查看SQL Server服务器日志

登录SQL Server管理工具(SSMS),查看管理 -> SQL Server日志,里面会记录登录失败的具体原因(如身份验证模式不匹配、账号权限不足等)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:48:08