JAVA JDBC 连接Oracle数据库报错ORA-12505解决方案

本文详细解析了使用Java JDBC连接Oracle数据库时遇到的ORA-12505错误,对比了Navacat和PLSQLDeveloper的连接方式,阐述了为何Java JDBC需要使用INSTANCE_NAME而非service_name,并提供了查询INSTANCE_NAME及正确配置连接字符串的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

Navacat或PLSQL Developer连Oracle数据库不报错,可以正常查询数据,但是使用Java的JDBC连接数据库就会报错:
java.sql.SQLException:Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
The Connection descriptor used by the client was:

原因:

Navacat或PLSQL Developer可以直接使用service_name连接Oracle数据库;
JAVA的JDBC不能使用service_name连接,需要使用INSTANCE_NAME才可以进行连接;
JAVA的OJDBC支持3种连接方式,但是这里使用的是sid方式连接,可以通过以下解决方案,查询到数据库的sid,然后使用sid连接;或者更换为OJDBC的service_name方式进行连接,详情可点击这里查看我的另一篇文章关于OJDBC的三种连接方式。

解决方法:

连接Oracle数据库查询数据库的INSTANCE_NAME;

SELECT INSTANCE_NAME FROM v$instance;

将查询到的INSTANCE_NAME换到JAVA的JDBC上连接即可;

例:

在这里插入图片描述
在这里插入图片描述

### 解决业务应用连接 Oracle 数据库报错 ORA-12505 的方法 当业务应用程序通过 JDBC 连接Oracle 数据库时,如果出现 `ORA-12505` 错误提示 "Listener does not currently know of SID given in connect descriptor" ,这通常意味着监听器无法识别所提供的服务名或实例 ID (SID)[^1]。 #### 可能原因分析 该问题可能由以下几个因素引起: - **配置文件中的 TNS 名字解析设置有误** 如果 tnsnames.ora 文件里定义的服务名称拼写错误或者指向了一个不存在的数据库实例,则会导致此异常情况发生。 - **监听进程未启动** 当本地网络服务侦听程序没有正常工作时也会引发上述现象。可以尝试重启 listener 来解决问题。 - **环境变量配置不当** 对于某些操作系统而言,ORACLE_HOME 和 PATH 环境变量如果没有被正确设定也可能造成类似的故障表现。 #### 推荐解决方案 ##### 方法一:验证并修正 TNS 配置项 检查客户端机器上的 `$ORACLE_HOME/network/admin/tnsnames.ora` 文件中对应条目的准确性,确保其中指定的目标主机地址、端口号和服务名都无误,并且与服务器端保持一致。 ```bash # Example entry in tnsnames.ora file MYDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = myhost.example.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = myservicename) ) ) ``` ##### 方法二:确认 Listener 正常运行 登录到目标数据库所在的物理机上执行如下命令来查看当前状态;如果不是处于 READY 状态则需重新加载配置或是直接停止再开启它。 ```sql lsnrctl status ``` 对于 Linux 或 Unix 平台来说还可以利用 ps 命令查找是否存在名为 tnslsnr 的守护线程正在活动当中。 ##### 方法三:调整 Java 应用程序连接字符串 有时修改应用程序内部使用的 URL 形式的连接串也可以绕过这个问题。例如将 jdbc:oracle:thin:@//hostname:port/service_name 改成带有具体 SID 版本的形式即 jdbc:oracle:thin:@hostname:port:sid。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值