ORA-12505, TNS:listener does not currently know of SID given in connect descriptor问题解决

在搭建测试环境时,碰到过两次这个问题了,ORA-12505, TNS:listener does not currently know of SID given in connect descriptor不能识别描述信息中给的sid。第一次碰到的时候时间比较赶,然后照着网上的办法,将pl/sql写在tnsnames.ora中的连接描述都拷过去就解决了,然后同事说了下应该有更好的解决办法。后面过了几天就忘记了这个事情了,昨天搭建uat环境的时候又遇到了,因为配置都是从另外一个环境拷的,另外一个环境使用的jdbk连接信息就是使用jdbc:oracle:thin:@x.x.x.x:1521:sitdb ,然后再一次报了ORA-12505。这次得找找有没有更好的解决办法。

报错的url:jdbc:oracle:thin:@x.x.x.x:1521:uatdb

修改的url:jdbc:oracle:thin:@(DESCRIPTION
 =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = x.x.x.x)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = uatdb)))

jdbc连接oracle肯定有不同的写法,找到网上实际上有三种写法

格式一:jdbc:oracle:thin:@//<host>:<port>/<service_name>
格式二:jdbc:oracle:thin:@<host>:<port>:<SID>
格式三:jdbc:oracle:thin:@<TNSName>

很明显了,格式二的方式在sit环境可行,在uat环境不可行,而且格式二配置的是sid,格式三配置的是service_name。

       需要了解sid和service_name之前,先说一下实例。实例是操作系统中访问数据库所需要的一系列的进程和内存的集合。即使没有任何数据文件,实例也可以启动。但是要想访问数据库,必须把数据库文件加载进实例中。实例和数据库的区别可以简单概括为:实例是临时的,它只在相关的进程和内存集合存在时存在,而数据库是永久的,只要文件存在它就存在。一个实例只能对应一个数据库,但是一个数据库可以由多个实例对应(如RAC)。RAC就是多个实例同时打开一个数据库文件的系统,在结构上是多台机器,每台机器运行一个实例,每个实例都打开同一个数据库(这个是用磁盘共享技术实现的),这些实例之间需要同步高速缓存,这样保证多个实例是完全一致的,不会相互冲突乃至覆盖。
       SID即INSTANCE_NAME是用来唯一标示实例的。SERVICE_NAME是oracle8i新引进的,8i之前,一个数据库只能由一个实例对应,但是随着高性能的需求,并行技术的使用,一个数据库可以由多个实例对应了,比较典型的应用如RAC。为了充分利用所有实例,并且令客户端连接配置简单,ORACLE提出了SERVICE_NAME的概念。该参数直接对应数据库,而不是某个实例。

      这两段抄过来的,那应该是uat环境有多个实例,不能光使用格式二方式来指定jdbc的连接,由于格式三的太长,可以考虑使用格式一就好了jdbc:oracle:thin:@//x.x.x.x:1521/uatdb。还有一个疑问,环境文档上给的单实例的测试环境给的是sid,而多实例的环境给的是service_name?还是说单实例时sid就是service_name,暂时先这样。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值