------解決方法 --------------------------------------------------------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