我们有一个本地运行的应用程序,我们遇到了以下错误:

ORA-12514: TNS:监听器当前不知道所请求的服务 在连接描述符中

我已经使用正确解决的tnspring测试了连接 我尝试使用SQLPlus进行连接,但失败了,出现了与上面相同的错误。我在SQLPlus中使用了以下语法:

sqlplus username/password@addressname[or host name]

我们已核实:

服务器上的TNS Listener正在运行。 服务器上的Oracle本身正在运行。

我们不知道这个环境发生了什么变化。 还有什么可以测试的吗?


当前回答

我有一个案例,我使用DBMS,我必须完成一个数据库连接表单。

我把SID放入数据库字段,在下拉框中,在字段旁边,我有“服务名称”值而不是“SID”值。 (通常我不使用Oracle数据库,所以我没有意识到差异)

这就是我得到错误消息的原因。

其他回答

检查数据库是否启动。登录到服务器,将ORACLE_SID环境变量设置为您的数据库SID,并作为本地连接运行SQL*Plus。

当应用程序为每个数据库交互建立新连接或连接未正确关闭时,可能会发生此错误。监视和确认这一点的免费工具之一是Oracle Sql developer(尽管这不是您可以用来监视DB会话的唯一工具)。

您可以从oracle网站Sql Developer下载该工具

下面是如何监控你的会话的截图。(如果您在看到ORA-12514错误时看到应用程序用户堆积了许多会话,那么这很好地表明您可能有连接池问题)。

我已经实现了下面的解决方法来解决这个问题。

我已经使用命令提示符设置了ORACLE_HOME (右键单击cmd.exe并以系统管理员身份运行)。 使用以下命令 设置oracle_home="到oracle home的路径" 进入“所有程序——> Oracle -ora home1——>配置迁移工具——> Net Manager——> Listener” 从下拉菜单中选择数据库服务。 全局数据库名和SID都设置为相同(在我的例子中是ORCL)。 设置“Oracle Home Directory”。

Oracle Net Manager窗口示例:

单击File并保存网络配置。

我有这个问题,修复是确保在tnsnames。ora SERVICE_NAME是数据库中有效的服务名称。要找出有效的服务名称,您可以在oracle中使用以下查询:

select value from v$parameter where name='service_names'

有一次我更新了tnsnames。奥拉:

TEST =
   (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = *<validhost>*)(PORT = *<validport>*))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = *<servicenamefromDB>*)
    )
)

然后我就跑:

sqlplus user@TEST

成功! 监听器基本上是在告诉你,不管你使用的是什么service_name,根据DB,都不是一个有效的服务。

(*我从Win7客户端工作站运行sqlplus到远程DB,责怪dba;) *)

对于使用spring-boot和jdbc进行连接的用户。 在application.properties中编写jdbcUrl时必须小心

与SID在数据库连接- source.datasource.jdbcUrl = jdbc:oracle:thin:@[HOST][:PORT]:SID

在db连接中使用服务名称 global .datasource. jdbcurl = jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

这对我很有用:)