Weblogic 6.1无法解析Service_name格式Oracle连接串如何解决
- 基于Java 1.3开发的遗留Web应用部署于Unix服务器的Weblogic 6.1环境,通过连接池对接2个Oracle数据库
- 受行业统一调整要求,数据库侧完成配置重构,原基于SID的连接方式需切换为Service_name方式
- 当前环境存在硬约束:不支持升级Weblogic版本
此前使用的SID格式JDBC连接串为:jdbc:oracle:thin:@hostname.test.intranet:1521:sid
直接将SID位置替换为service_name值得到的测试连接串为:jdbc:oracle:thin:@hostname.test.intranet:1521:service_name
使用该串在Weblogic控制台测试连接时抛出错误:
Status : Failure -Test failed: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
报错核心原因是:jdbc:oracle:thin:@<host>:<port>:<值> 是Oracle JDBC thin驱动固定的SID连接语法,无论最后一段传什么内容,驱动都会按SID去解析连接请求,自然会被数据库监听器拒绝。Weblogic 6.1环境下可选择以下两种经过生产验证的方案对接:
方案1:使用TNS描述符格式连接串(无需更换驱动,兼容性最优)
Oracle thin驱动从8i版本开始就支持直接在连接串中写入完整TNS配置,不需要依赖服务器本地的tnsnames.ora文件,完全适配Weblogic 6.1自带的JDBC驱动版本,连接串格式如下:jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hostname.test.intranet)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=填写实际的service_name值)))配置时直接将整串填入连接池的JDBC URL字段即可,不需要调整其他驱动配置,测试通过后保存激活即可。
方案2:更换驱动后使用简写Service_name连接串
如果偏好短连接串格式,可以先将Weblogic连接池使用的Oracle JDBC驱动替换为10.2.0.x版本的ojdbc14.jar(该版本是最后一个兼容Java 1.3运行时的Oracle官方JDBC驱动),替换时需要移除Weblogic类路径下原有的老版本classes12.zip驱动包,避免类冲突,之后使用如下格式的连接串即可:jdbc:oracle:thin:@//hostname.test.intranet:1521/填写实际的service_name值
配置注意事项
- 两个数据库的连接池需要分别填入对应主机地址、端口、service_name参数,禁止复用配置避免出现串库问题
- 驱动替换完成后需要重启对应Weblogic节点才能生效,启动时需检查日志是否存在JDBC相关的类加载冲突报错
- 所有配置调整先在控制台做单连接测试,测试通过后再保存激活,避免直接重启导致业务中断
内容的提问来源于stack exchange,提问作者Vishesh

