JDBC oracle thin 鏈接方式

最近使用jdbc鏈接 oracle時報錯:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor The Connection descriptor used by the client was:
10.12.162.84:1521:xxxx

登錄 oracle數據發如今network/admin/文件夾下的tnsnames.ora中配置的是:SERVICE_NAME =xxxx。通過查詢發現,是jdbc中的鏈接串使用的不正確。 Java JDBC Thin Driver 鏈接 Oracle有三種方法,以下:

格式一: Oracle JDBC Thin using a ServiceName:
jdbc: oracle: thin:@//<host>:<port>/<service_name>
Example: jdbc: oracle: thin:@//192.168.2.1:1521/XE
注意這裏的格式,@後面有//, 這是與使用SID的主要區別。
這種格式是 Oracle 推薦的格式,由於對於集羣來講,每一個節點的SID 是不同的,可是SERVICE_NAME 確能夠包含全部節點。

格式二: Oracle JDBC Thin using an SID:
jdbc: oracle: thin:@<host>:<port>:<SID>
Example: jdbc: oracle: thin:@192.168.2.1:1521:X01A
Note:
Support for SID is being phased out. Oracle recommends that users switch over to usingservice names.

格式三: Oracle JDBC Thin using a TNSName:
jdbc: oracle: thin:@<TNSName>
Example: jdbc: oracle: thin:@GL
Note:
Support for TNSNames was added in the driver release 10.2.0.1

linux下查詢sid的方法:
在配置 oracle環境變量的狀況可使用 echo $ ORACLE_SID,若是沒有可使用ps -ef |grep oracle 來查詢:
oracle    2548     1  0 Aug17 ?        00:00:00 ora_pmon_xxxx
後面的xxxx就是對應的sid。

在windows環境下, oracle是之後臺服務的方式被管理的,因此看"控制面板->管理工具->服務 裏面的名稱:"OracleServiceORCL",則ORCL就是sid;

service_name 和sid的區別:
Service_name:該參數是由 oracle8i引進的。在8i之前,使用SID來表示標識數據庫的一個實例,可是在 Oracle的並行環境中,一個數據庫對應多個實例,這樣就須要多個網絡 服務名,設置繁瑣。爲了方便並行環境中的設置,引進了Service_name參數,該參數對應一個數據庫,而不是一個實例,並且該參數有許多其它的好處。該參數的缺省值爲Db_name. Db_domain,即等於Global_name。一個數據庫能夠對應多個Service_name,以便實現更靈活的配置。該參數與SID沒有直接關係,即沒必要Service name 必須與SID同樣 sid是數據庫實例的名字,每一個實例各不相同。