首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

ORA-12505 connection refuse 终极解决方法!

2014-01-28 
------解决方法--------------------------------------------------------p在项目遇到一个问题,在用java

------解决方法--------------------------------------------------------p;        在项目遇到一个问题,在用java中用jdbc连接oracle时出错,log中记录“connectin refuse(DESCRIPTION=(TMP=)(VSNNUM=168354658)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))”,采用的连接url是“jdbc:oracle:thin:@hostname:1521:ovsDB”, 由于连接的配置是在一个开发工具中进行的,于是写了一个简单的测试程序在eclipse中测试,结果是提示出错“ORA-12505 :listener does not currently know of SID given in connect descriptor”, oracle服务器的监听器不能识别这个SID, 本地的tnsnames.ora中是这样写的 
ovsDB =  (网络服务名)
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = remotehostname)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ovsDB)
    )
  )
SID和tnsnames.ora配置都是维护服务器的人给的,在使用"oracle SQL developer" 和sqlplus连接时都可以正常连接上,百思不得其解.
         在查阅了资料后,罪魁祸首指向SID,在此灰常感谢参考URL中的blog主人, 原因是工具在连接时只需给其指定service_name,而使用jdbc连接是则必须要SID, 使用oracle SQL developer连接上后执行select instance_name from v$instance后得出的instance_name是ovsDatabase,这个才是oracle服务器上的SID, 于是在url中使用这个SID连接,终于正常了!问题解决!
         在解决这个问题过程中,总结出的东东有:
           1. 工具在连接时只需给其指定service_name,而使用jdbc连接是则必须要在url中提供SID;
        2.客户端的tnsnames.ora中的网络服务名并不是SID,而是一个可任意命名的代号,oracle客户端或者其他连接工具在连接服务器是使用这个代号来解析其中的service_name.
参考URL:  http://www.blogjava.net/itspy/archive/2007/12/20/169072.html
http://www.hinn.cn/2009/04/oracle_sqlnetora_tnsnamesora_listenerora.html