使用虚拟主机名'oracle'的SAP Connector Oracle JDBC连接失败问询
SAP Connector Oracle JDBC连接串替换逻辑导致连接失败问题排查与修复建议
问题现象
原本可用的Oracle JDBC连接串为jdbc:oracle:thin:@myremotehost:1521:mysid,在SAP Connector中按规范配置虚拟主机名oracle、虚拟端口61521后,生成的连接串为jdbc:oracle:thin:@oracle:61521:mysid,此时抛出连接异常:
org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection: DataSource returned null from getConnection(): org.ops4j.pax.jdbc.impl.DriverDataSource@45d186af
排查步骤
- 在远程数据库服务器安装SAP JDK 8
- 用Maven构建模拟SAP Connector技术栈的独立JAR(依赖Spring-Boot/Spring-JDBC/HikariCP/Oracle JDBC)
- 使用原连接串测试该JAR,连接成功
- 在远程服务器
/etc/hosts中添加映射oracle XXX.XXX.XXX.XXX(XXX为myremotehost的实际IP) - 使用
jdbc:oracle:thin:@oracle:1521:mysid测试JAR,连接成功 - 将虚拟主机名改为
myoracle,生成连接串jdbc:oracle:thin:@myoracle:61521:mysid,SAP Connector连接成功
问题根源分析
经分析,问题源于SAP Connector采用Java String.replace()进行全局字符串替换:
- 会将连接串中所有的
oracle替换为myremotehost - 同时将
61521替换为1521
最终连接串被修改为无效的jdbc:myremotehost:thin:@myremotehost:1521:mysid,破坏了JDBC URL中标识驱动类型的第一个oracle字段,导致驱动无法正确解析连接串,进而无法建立数据库连接。
修复建议
建议SAP Connector开发团队修改连接串替换逻辑,避免全局替换带来的问题,可采用以下两种方式:
- 使用正则表达式精准匹配
@符号右侧的主机名和端口进行替换 - 仅截取
@符号后的子串进行替换操作,再拼接回原URL的前缀部分
同时期望SAP官方修复此问题并创建对应的Bug记录。
内容的提问来源于stack exchange,提问作者devnull
相关产品推荐
相关产品推荐

