如何跨服务器从Linux的Spring Boot应用连接Windows的SQL Server数据库并执行SQL命令
远程SQL Server访问实现方案
按照链路复杂度从低到高排列,优先选择链路最短、稳定性最高的方案:
1. 原生JDBC直连(首选实现)
这是性能最好、维护成本最低的方案,完全不需要依赖已有的SSH、跨服HTTP调用能力,只要网络链路打通即可使用。
具体落地步骤:
- 网络层打通:
- Windows服务器端配置防火墙,放通SQL Server默认1433端口的入站规则,允许Linux服务器的IP访问
- 在Windows的SQL Server配置管理器中,开启SQL Server服务的TCP/IP协议,确认端口绑定为1433,重启SQL Server服务生效
- 项目依赖引入:在Spring Boot项目中添加微软官方提供的
mssql-jdbc驱动依赖,版本匹配当前使用的JDK版本、SQL Server版本即可 - 数据源配置:
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver spring.datasource.url=jdbc:sqlserver://<Windows服务器IP>:1433;databaseName=<目标库名>;encrypt=false;trustServerCertificate=true spring.datasource.username=<SQL Server登录账号> spring.datasource.password=<SQL Server登录密码> - 业务实现:直接通过Spring自带的
JdbcTemplate封装简单SQL的执行逻辑,支持查询、增删改操作,记得给数据库账号配置最小操作权限,避免高危操作风险。
2. SSH隧道端口转发(网络策略受限场景备选)
如果两个服务器之间有安全组/防火墙限制,不允许直接开放1433端口跨网访问,可以利用已有的SSH登录能力,建立加密隧道转发数据库流量。
具体实现:
- 在Linux服务器上执行SSH端口转发命令,将本地1433端口的流量,通过SSH连接加密转发到Windows服务器本机的SQL Server端口:
ssh -L 1433:127.0.0.1:1433 <Windows服务器SSH账号>@<Windows服务器IP> - 执行完成后,Linux侧访问本地
127.0.0.1:1433的数据库请求,会全程通过SSH加密链路传到Windows的SQL Server服务,后续数据源配置只需要把连接URL里的地址改成127.0.0.1:1433即可,其余配置和直连方案完全一致 - 生产环境建议配合
autossh做SSH隧道的常驻保活,避免连接断开导致数据库访问中断。
3. HTTP代理转发(无直连、无SSH隧道权限场景兜底)
如果既不能开放数据库端口、也不能用SSH做隧道转发,可以利用已有的跨服HTTP调用能力,在Windows服务器侧部署一个轻量的SQL执行代理服务:
- 在Windows服务器上跑一个简单的接口服务,接收Linux侧Spring Boot发来的带SQL语句的HTTP请求,在Windows本地连接SQL Server执行SQL,把查询结果序列化后通过HTTP响应返回
- 注意必须给代理接口加权限校验、SQL语句白名单校验,禁止执行DROP/ALTER/TRUNCATE这类高危操作,避免出现安全风险
- 这个方案链路最长、维护成本最高,仅适用于前两个方案都走不通的极端场景。
内容的提问来源于stack exchange,提问作者Raul Marquez
相关产品推荐
相关产品推荐

