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

