Spring Boot本地通过SSH隧道连接Oracle LDAP数据源超时如何解决
问题解决办法
根因分析
你目前只为LDAP服务的389端口做了SSH端口转发,Oracle JDBC驱动的工作逻辑是:先通过LDAP服务查询对应服务名srvcnm的Oracle数据库真实内网地址与端口,再主动连接该地址获取数据库连接。
你本地机器无法直接访问Oracle数据库的真实内网地址,因此JDBC驱动查询完LDAP后连接真实数据库时触发超时。中转服务器可以正常访问LDAP和Oracle内网地址,因此部署在中转的服务可以正常运行。
解决方案
方案一:直连Oracle端口(推荐,配置更简单)
- 先登录远端中转服务器,查询
srvcnm对应的Oracle数据库真实连接信息:- 可执行
tnsping srvcnm命令,返回结果中会包含Oracle数据库的内网域名/IP、端口、服务名/实例名 - 也可直接联系运维获取该服务名对应的直连数据库地址,例如拿到信息为
oracle.internal.host:1521/orcl_service
- 可执行
- 建立Oracle数据库端口的SSH隧道,执行命令:
可添加ssh -L 127.0.0.1:1521:oracle.internal.host:1521 user@remote.server.host-Nf参数让隧道在后台静默运行:ssh -NfL 127.0.0.1:1521:oracle.internal.host:1521 user@remote.server.host - 修改本地Spring Boot配置的数据源URL,替换LDAP格式为直连格式:
spring: datasource: url: jdbc:oracle:thin:@//127.0.0.1:1521/orcl_service
方案二:保留LDAP连接方式
- 同样先从中转服务器获取LDAP返回的Oracle数据库真实内网域名/IP、端口,例如为
oracle.internal.host:1521 - 同时建立LDAP和Oracle两个端口的SSH隧道:
# LDAP端口隧道 ssh -NfL 127.0.0.1:8081:some.ldap.host:389 user@remote.server.host # Oracle端口隧道 ssh -NfL 127.0.0.1:1521:oracle.internal.host:1521 user@remote.server.host - 修改本地hosts文件,将Oracle内网域名映射到本地地址:
- Windows系统路径:
C:\Windows\System32\drivers\etc\hosts - Linux/macOS系统路径:
/etc/hosts
在文件末尾添加一行:
127.0.0.1 oracle.internal.host - Windows系统路径:
- 原有LDAP格式的数据源URL无需修改,重启应用即可正常连接。
注意事项
- 若Oracle为RAC多节点集群,需要将所有节点的域名/IP都做端口转发,并都添加到本地hosts映射中
- SSH隧道中断后需要重新执行隧道建立命令,可搭配autossh等工具实现隧道自动重连
内容的提问来源于stack exchange,提问作者ZedZed
相关产品推荐
相关产品推荐

