Service_name 和Sid的區別
Service_name:該參數是由oracle8i引進的。
在8i以前,使用SID來表示標識數據庫的一個實例,但是在Oracle的並行環境中,一個數據庫對應多個實例,這樣就需要多個網絡服務名,設置繁瑣。為了方便並行環境中的設置,引進了Service_name參數,該參數對應一個數據庫,而不是一個實例,而且該參數有許多其它的好處。
該參數的缺省值為Db_name. Db_domain,即等於Global_name。一個數據庫可以對應多個Service_name,以便實現更靈活的配置。該參數與SID沒有直接關系,即不必Service name 必須與SID一樣。Sid是數據庫實例的名字,每個實例各不相同。
可以簡單的這樣理解:
一個公司比喻成一台服務器,數據庫是這個公司中的一個部門。
SID:一個數據庫可以有多個實例(如RAC),SID是用來標識這個數據庫內部每個實例的名字,就好像一個部門里,每個人都有一個自己的名字。
SERVICE_NAME:是這個數據庫對外宣稱的名字,外面的人要想連接我這個數據庫,你就在客戶端的連接串里寫上service_name。它就像一個部門的名字,這個部門的名稱在看門大爺(listener)那里有登記,
看門大爺一看你是要找SERVICE_NAME這個部門,就告訴你我們公司確實有這個部門,於是你就找到了,連接就建立了。
一句話來說就是:SID是對內的,是實例級別的一個名字,用來內部之間稱呼用。SERVICE_name是對外的,是數據庫級別的一個名字,用來告訴外面的人,我數據庫叫"SERVICE_NAME"。
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``