Spring Boot集成Atomikos连接Microsoft SQL Server出现TCP/IP连接失败
问题排查及修复方案
核心问题
从报错日志可以明确判定:JDBC驱动将完整的JDBC连接串当成了数据库主机地址尝试连接,属于配置逻辑错误。
你当前getDataSource方法的server参数大概率传入的是完整的jdbc:sqlserver://127.0.0.1;databaseName=sample;串,但SQLServerXADataSource的serverName属性仅需要填写纯主机IP/域名,不能带JDBC协议前缀、端口、库名等信息,同时你还缺失了databaseName的XA属性配置。
修复步骤
1. 修正XA数据源配置
拆分连接参数,修改getDataSource方法的配置逻辑:
public AtomikosDataSourceBean getDataSource(String userName, String password, String server, int port, String databaseName, String resourceName) { AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean(); dataSource.setUniqueResourceName(resourceName); dataSource.setXaDataSourceClassName("com.microsoft.sqlserver.jdbc.SQLServerXADataSource"); Properties xaProperties = new Properties(); xaProperties.setProperty("user", userName); xaProperties.setProperty("password", password); // server仅传入纯IP/域名,例如127.0.0.1 xaProperties.setProperty("serverName", server); // 显式指定端口,默认端口为1433 xaProperties.setProperty("portNumber", String.valueOf(port)); // 补充数据库名配置 xaProperties.setProperty("databaseName", databaseName); dataSource.setXaProperties(xaProperties); dataSource.setMaxPoolSize(10); return dataSource; }
如果你的SQL Server使用了非默认实例、SSL加密等配置,还需要补充对应属性:
- 实例名配置:
xaProperties.setProperty("instanceName", "你的实例名") - 测试环境关闭SSL验证:
xaProperties.setProperty("encrypt", "false")
2. 本地连通性校验
先通过命令行工具确认端口可连通:
telnet 127.0.0.1 1433
如果连接失败,检查Windows防火墙是否开放1433端口入站规则,以及SQL Server服务是否正常启动。
3. 开启SQL Server XA事务支持
SQL Server默认未开启XA事务能力,需要补充如下配置:
- 在SQL Server的master库执行安装路径下的
\Microsoft SQL Server\对应版本号\Tools\Binn\xa_install.sql脚本 - 给数据库用户
sampleUser授予SqlJDBCXAUser角色权限 - 进入Windows组件服务>本地DTC>属性>安全设置,勾选「启用XA事务」选项
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

