先來講一個小故事,2015年6月份,有個客戶遷移了數(shù)據(jù)庫,,由單實(shí)例數(shù)據(jù)庫變成了RAC,。JAVA應(yīng)用程序出現(xiàn)了無法連接數(shù)據(jù)庫的情況,但是PL/SQL能連接上數(shù)據(jù)庫,。由于項(xiàng)目比較龐大,,雖然在半夜切換的,但是也不能接受長時間的業(yè)務(wù)停頓,。當(dāng)時,,我對ORACLE技術(shù)也只是略知皮毛。在咨詢過公司研發(fā)后,,他們給我的建議是:參考PL/SQL的連接參數(shù),,將spring中jdbc連接的url由jdbc:oracle:thin:@10.2.0.2:1521:orcl改為jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 10.2.0.2)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl))),結(jié)果問題解決了,,當(dāng)時我挺佩服公司研發(fā)的?,F(xiàn)在看來,這個并不是最佳的解決方案,,下面通過講解SID和SERVICE_NAME的區(qū)別,,我將給出更佳的解決方案。 在講解SID和SERVICE_NAME之前,,先說一下實(shí)例,。實(shí)例是操作系統(tǒng)中訪問數(shù)據(jù)庫所需要的一系列的進(jìn)程和內(nèi)存的集合。即使沒有任何數(shù)據(jù)文件,,實(shí)例也可以啟動,。但是要想訪問數(shù)據(jù)庫,必須把數(shù)據(jù)庫文件加載進(jìn)實(shí)例中,。實(shí)例和數(shù)據(jù)庫的區(qū)別可以簡單概括為:實(shí)例是臨時的,,它只在相關(guān)的進(jìn)程和內(nèi)存集合存在時存在,而數(shù)據(jù)庫是永久的,,只要文件存在它就存在,。一個實(shí)例只能對應(yīng)一個數(shù)據(jù)庫,但是一個數(shù)據(jù)庫可以由多個實(shí)例對應(yīng)(如RAC),。RAC就是多個實(shí)例同時打開一個數(shù)據(jù)庫文件的系統(tǒng),,在結(jié)構(gòu)上是多臺機(jī)器,每臺機(jī)器運(yùn)行一個實(shí)例,,每個實(shí)例都打開同一個數(shù)據(jù)庫
(這個是用磁盤共享技術(shù)實(shí)現(xiàn)的),,這些實(shí)例之間需要同步高速緩存,這樣保證多個實(shí)例是完全一致的,,不會相互沖突乃至覆蓋,。 SID即INSTANCE_NAME是用來唯一標(biāo)示實(shí)例的。SERVICE_NAME是oracle8i新引進(jìn)的,8i之前,,一個數(shù)據(jù)庫只能由一個實(shí)例對應(yīng),,但是隨著高性能的需求,并行技術(shù)的使用,,一個數(shù)據(jù)庫可以由多個實(shí)例對應(yīng)了,,比較典型的應(yīng)用如RAC。為了充分利用所有實(shí)例,,并且令客戶端連接配置簡單,,ORACLE提出了SERVICE_NAME的概念。該參數(shù)直接對應(yīng)數(shù)據(jù)庫,,而不是某個實(shí)例。 了解了SID和SERVICE_NAME之后,,我突然覺得前面故事中使用的解決方案并不是最佳的解決方案,,因?yàn)镾ERVICE_NAME的出現(xiàn)就是為了應(yīng)對并發(fā)技術(shù),簡化客戶端連接配置,。通過SERVICE_NAME應(yīng)該能找到更好的解決方案,。通過查找JDBC幫助得知JDBC連接ORACLE的方法由三種: 格式一:jdbc:oracle:thin:@//<host>:<port>/<service_name> 不難看出,故事中使用RAC之前,,JDBC是使用格式二連接的,,使用RAC后實(shí)例增多了,SID已經(jīng)不唯一,,格式二已經(jīng)無法完全利用所有資源,。研發(fā)參考PL/SQL的連接方法剛好碰巧使用了格式三。因?yàn)閖ava應(yīng)用服務(wù)器跟數(shù)據(jù)庫服務(wù)器是分離的,,應(yīng)用服務(wù)器上沒有oracle的服務(wù)端以及客戶端,。雖然解決方案中沒有使用TNSName,但是使用了TNSName的連接描述,效果是一樣的,。既然JDBC有三種連接方案,,我們不妨再看一下第一種方案。再加上前面的講解內(nèi)容,,我想大家已經(jīng)都知道故事中的問題該怎么修改了,,只要改成jdbc:oracle:thin:@//10.2.0.2:1521/orcl就可以了,而且這種格式也支持單實(shí)例數(shù)據(jù)庫,。這也是ORACLE在8i之后增加SERVICE_NAME的初衷,。 通過這個故事,我們可以看到,,只有充分了解了ORACLE的知識,,才能更好的使用ORACLE技術(shù)。 |
|