2013-04-04 50 views
9

我有一個基於java的服務器(Tomcat),它使用JDBC連接來連接到Oracle數據庫。有多種連接數據庫的方法:SID,TNS名稱,服務名稱。在JDBC連接中使用TNS名稱和服務名稱之間的區別

我想了解是什麼每個這些連接的和這將是如果連接到集羣數據庫推薦的連接(SID,TNS,或服務)之間的差。這裏是我們對數據庫的TNS名稱:

MY_NICE_TNS_NAME.MY_COMPANY.COM = 

(DESCRIPTION = 

    (ADDRESS = (PROTOCOL = TCP)(HOST = myhostname)(PORT = 1521)) 

    (LOAD_BALANCE = YES) 

    (CONNECT_DATA = 

    (SERVER = DEDICATED) 

    (SERVICE_NAME = MY_NICE_SERVICE_NAME.MY_COMPANY.COM) 

    (FAILOVER_MODE = 

    (TYPE = SELECT)(METHOD = BASIC)(RETRIES = 180)(DELAY = 5) 

    ) 

) 

) 

謝謝!

+1

只要只有一個主機名指定爲你實際上沒有任何區別。如果你連接到RAC(OPS)或DataGuard,那麼是的。 SID是唯一的,不可更改並以數字結尾。雖然SERVICE_NAME可以出現在一個或多個節點上。它也可以在節點之間移動 – ibre5041 2013-04-05 09:44:28

+0

謝謝,很高興知道。看到我下面的評論。我們有一個RAC。 – 2013-04-06 12:03:55

+1

如果您使用RAC,那麼您應該爲每個節點指定主機名。請參閱:http://stackoverflow.com/questions/13424385/oracle-connection-string-for-rac-environment – ibre5041 2013-04-06 17:59:57

回答

3

甲骨文SID是唯一的名稱唯一標識您的實例/數據庫,在那裏作爲服務名是你給的TNS別名當您遠程連接到你的數據庫,該服務名稱被記錄在tnsnames.ora文件在您的客戶和它可以與SID相同,你也可以給它任何你想要的名字。

SERVICE_NAME是Oracle 8i中起,其中數據庫可以用本身聽衆註冊新功能。如果以這種方式向偵聽器註冊數據庫,則可以在tnsnames.ora中使用SERVICE_NAME參數,否則 - 在tnsnames.ora中使用SID。

另外,如果您有OPS(RAC),則每個實例都會有不同的SERVICE_NAME。

SERVICE_NAMES指定數據庫服務,此實例連接一個或多個名稱。您可以指定多個服務名稱以區分同一數據庫的不同用途。例如:

SERVICE_NAMES = sales.acme.com,widgetsales.acme.com

您還可以使用的服務名稱來識別單個服務,可從兩個不同的數據庫,通過使用複製的。

在Oracle Parallel Server環境中,必須爲每個實例設置此參數。

TNS的是SQL *網絡配置文件,它定義datbases地址建立連接它們。

+0

我們實際上有一個RAC,這就是我問的原因,因爲如果我們失去一個數據庫,它碰巧成爲我指向的人,然後我們放棄這項服務。所以,基本上,你所說的是我需要指向TNS,以便它默認爲正在工作的那個。那是對的嗎? – 2013-04-06 11:59:55

+1

是的,這是正確的。在您的TNS中,您可以爲您的RAC指定不同的節點。在這種情況下,如果您的某個節點出現故障,該服務仍然可用。 – TheEwook 2013-04-06 12:02:16

4

SERVICE_NAME是一個別名到數據庫實例(或許多實例)。這樣做的主要目的是如果你正在運行一個集羣。使用這個我們可以連接集羣內的特定數據庫。和其他方式,我們可以連接到一個數據庫實例,這是一個Oracle數據庫實例的名稱爲的唯一的數據庫實例。

總之,SID =您的數據庫的唯一名稱,SERVICE_NAME =連接時使用的別名。

有幾種方法可以提供像直接指定,tnsnames.ora中(即TNS名稱)的數據庫信息,LDAP目錄,網絡信息服務。

甲TNS(Ť ransparent Ñ etwork 小號 ubstrate)名稱是被保持在$ORACLE_HOME/network/admin
此文件中tnsnames.ora文件中的條目的名稱包含一個用於由所述系統連接的信息到oracle數據庫。使用這個客戶端可以透明地獲取與服務器相關的信息。它包含以下信息

PROTOCOL 
HOST IP ADDRESS 
PORTNO 
SID or SERVICE_NAME 

mydb = 
    (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.35.15.1)(PORT = 1521)) 
    (CONNECT_DATA = (SID = mydb)) 

JDBC驅動程序使用TNS連接字符串連接如下

System.setProperty("oracle.net.tns_admin", PATH_TO_TNSNAMES.ORA); 
Class.forName ("oracle.jdbc.OracleDriver"); 
dbUrl = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST="+IPHOST+")(PORT="+PORT+"))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME="+DBNAME+")))" 

conn = DriverManager.getConnection(dbUrl, USERNAME, PASSWORD); 
相關問題