ora-12541本质是客户端无法连接监听器,70%因监听器未启动;需先检查lsnrctl status及环境变量,再核对jdbc url的host/port/servicename是否与监听端点和服务列表严格一致。
ora-12541 报错本质是客户端连不到监听器,70% 的情况是监听器根本没启动,不是 jdbc url 写错了或驱动版本不对。
lsnrctl status 返回 TNS-12560 或直接报错
这说明 lsnrctl 命令本身无法与监听器通信,常见于环境变量未设对。Linux/Unix 下必须确保 ORACLE_HOME 和 ORACLE_SID 已正确导出;Windows 下需以管理员身份运行 CMD,并确认当前用户能读取 $ORACLE_HOME\bin 目录。若 lsnrctl status 报 TNS-12560: TNS:protocol adapter error,优先检查这两项,而不是改 tnsnames.ora。
JDBC URL 中的 HOST 和 PORT 必须与 lsnrctl status 输出一致
执行 lsnrctl status 后,重点看 Listening Endpoints Summary 区域。例如输出中显示:
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
则 JDBC URL 中的 HOST 不能写 localhost 或 127.0.0.1(除非客户端也在数据库服务器本机),PORT 也不能写成 1522。典型错误 URL:jdbc:oracle:thin:@localhost:1521:orcl —— 这在远程连接时必然失败。
- HOST 应填监听器实际绑定的 IP(如
192.168.1.100)或可被解析的主机名 - PORT 必须严格匹配
Listening Endpoints中列出的端口 - 如果用的是服务名(
SERVICE_NAME),URL 格式应为@host:port/service_name,而非@host:port:SID
tnsnames.ora 不影响 JDBC thin 驱动,但影响本地 sqlplus 和 tnsping
JDBC thin 驱动不读取 tnsnames.ora,它只依赖 URL 字符串。所以修改 tnsnames.ora 对 JDBC 连接无效。但 tnsping 和本地 sqlplus /@TNS_ALIAS 会用它,因此可用 tnsping 快速验证监听器可达性:
-
tnsping ORCL成功 → 监听器响应正常,问题大概率出在 JDBC URL 的 HOST/PORT/ServiceName 拼写或大小写 -
tnsping ORCL失败且报TNS-12541→ 监听器未运行、端口被防火墙拦截、或listener.ora中HOST设为localhost导致仅监听回环
Windows 上还需检查 Windows Defender 防火墙 是否放行了监听端口(如 1521)的入站规则。
监听器启动但 Services Summary 为空或只有 UNKNOWN
执行 lsnrctl status 后,若 Services Summary 显示 Service "orcl" has 1 instance(s) 是理想状态;若为空或只有 UNKNOWN,说明数据库实例未向监听器注册。此时即使监听器在跑,JDBC 仍会报 ORA-12541(尤其在数据库刚启动后)。解决方式:
- 登录数据库:
sqlplus / as sysdba - 手动触发注册:
alter system register; - 等待约 60 秒,再运行
lsnrctl status确认服务已出现在列表中
注意:Oracle 19c+ 多租户环境下,CDB 的服务名(如 CDB$ROOT)和 PDB 的服务名(如 pdb1)不同,JDBC URL 中的 service_name 必须与 Services Summary 中列出的完全一致,包括大小写。











