R2DBC-MSSQL连接SQL Server报UnknownHostException如何解决
故障根因
触发java.net.UnknownHostException的核心原因是HOST参数配置错误:R2DBC MSSQL驱动不支持在HOST字段中拼接主机名\实例名格式的SQL Server命名实例地址,驱动会将PC_NAME\SQLEXPRESS整体作为主机名发起DNS解析,自然无法得到有效地址。
你当前配置中已经明确填写了SQLEXPRESS实例对应的TCP端口51306,这种场景下完全不需要在连接参数中传递实例名,实例名仅在通过SQL Server Browser服务动态查询实例端口时才需要单独配置。
修复方案
方案1:直连已知TCP端口(当前场景最优)
直接修改数据库配置中的host字段,删除\SQLEXPRESS后缀即可,修正后的配置如下:
com: database: host: PC_NAME # 仅填写主机名/IP,禁止拼接实例名 port: 51306 # 确认该端口为SQLEXPRESS实例实际监听的TCP端口 database: app_database username: user password: pass
该方案不依赖SQL Server Browser服务,连接性能更高,只要端口配置正确即可连通,和JDBC中硬编码端口连接的逻辑完全一致。
方案2:通过实例名自动发现端口
如果不希望硬编码实例端口,需要驱动通过SQL Server Browser服务自动查询实例对应端口,需单独配置实例名参数,禁止将实例名拼接在HOST字段中。代码侧新增实例名配置项即可:
val options = builder() .option(DRIVER, "sqlserver") .option(HOST, properties.host) // host仅填PC_NAME,不带实例名 .option(USER, properties.username) .option(PASSWORD, properties.password) .option(DATABASE, properties.database) .option(SSL, false) .option("instanceName", "SQLEXPRESS") // 单独传入实例名参数 .build()
使用该方案需要确保SQL Server Browser服务已启动,且服务器防火墙放行了UDP 1434端口,否则驱动无法查询到实例对应的端口信息。
连通性校验项
- 打开SQL Server配置管理器,确认SQLEXPRESS实例的TCP/IP协议已启用,IPAll配置项中的TCP端口值与配置文件中填写的51306一致;建议手动为命名实例指定固定TCP端口,避免实例重启后动态端口变化导致连接失败
- 本地调试阶段可将host临时改为
127.0.0.1绕开主机名解析环节,先验证端口连通性再调整主机名配置 - 若使用Windows集成身份验证连接本地实例,需额外引入r2dbc-mssql对应的集成认证依赖,你当前使用SQL账号认证无需额外配置
内容的提问来源于stack exchange,提问作者Alfa
相关产品推荐
相关产品推荐

