2011-01-28 102 views
183

我有一個使用JDBC(通過JPA),這是連接到開發數據庫使用主機名,端口和Oracle SID,像這樣的Java應用程序:的Java JDBC - 如何連接到Oracle使用服務名稱來代替SID

jdbc:oracle:thin:@ oracle.hostserver1.mydomain.ca:1521:XYZ

XYZ是Oracle SID。現在我需要連接到不使用SID的不同Oracle數據庫,而是使用Oracle「Service Name」。

我試過,但它不工作:

的jdbc:神諭:薄:@ oracle.hostserver2.mydomain.ca:1522:ABCD

ABCD是其他的服務名稱數據庫。

我在做什麼錯?

回答

324

http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/urls.htm#BEIDHCBA

薄型服務名稱語法

薄型服務名稱僅受JDBC Thin驅動程序支持。語法是:

@ //主機:端口號/服務名

例如:

JDBC:預言:瘦:斯科特/老虎@ //爲myhost:1521 /服務名

所以我會嘗試:

的jdbc:神諭:薄:@ // oracle.hostserver2.mydomain.ca:1522/ABCD

而且,每羅伯特·格雷特的回答,您也可以在JDBC URL指定TNS名稱如下:

jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL=TCP)(HOST=blah.example.com)(PORT=1521)))(CONNECT_DATA=(SID=BLAHSID)(GLOBAL_NAME=BLAHSID.WORLD)(SERVER=DEDICATED))) 
+6

+1供參考。 – DwB 2011-01-28 19:15:23

+6

+1爲參考手冊 – 2011-01-28 19:25:12

+7

+1,我來自未來,你的解決方案讓我再次頭痛了一個小時 – 2014-09-22 17:04:56

11

試試這個:jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522/ABCD

編輯:按照下面這個評論是正確actualy:jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD(注意//)

這裏是一個link到一個有用的文章

+2

這對我不起作用,我不得不使用`jdbc:oracle:thin:@ // oracle.hostserver2.mydomain.ca:1522/ABCD`。 – WynandB 2013-10-17 23:01:46

20

,您還可以在JDBC URL指定TNS名稱如下

jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL=TCP)(HOST=blah.example.com)(PORT=1521)))(CONNECT_DATA=(SID=BLAHSID)(GLOBAL_NAME=BLAHSID.WORLD)(SERVER=DEDICATED))) 
74

所以有兩個簡單的方法來完成這項工作。如果您不需要提供任何其他特殊的Oracle特定連接屬性,Bert F發佈的解決方案就可以正常工作。該格式是:

jdbc:oracle:thin:@//HOSTNAME:PORT/SERVICENAME 

但是,如果您需要提供其他特定於Oracle的連接屬性,那麼你需要使用長TNSNAMES風格。我最近不得不這樣做,以啓用Oracle共享連接(服務器在其中進行自己的連接池)。 TNS格式爲:

jdbc:oracle:thin:@(description=(address=(host=HOSTNAME)(protocol=tcp)(port=PORT))(connect_data=(service_name=SERVICENAME)(server=SHARED))) 

如果您熟悉Oracle TNSNAMES文件格式,那麼您應該看起來很熟悉。如果沒有,那麼只是谷歌它的細節。

5

這個討論幫助我解決了我一直在苦苦掙扎的問題。我在互聯網上四處張望,直到我發現Jim Tough於2011年5月18日15:17回答。有了這個答案,我能夠連接。現在我想用一個完整的例子回饋並幫助他人。這裏有:

import java.sql.*; 

public class MyDBConnect { 

    public static void main(String[] args) throws SQLException { 

     try { 
      String dbURL = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=whatEverYourHostNameIs)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=yourServiceName)))"; 
      String strUserID = "yourUserId"; 
      String strPassword = "yourPassword"; 
      Connection myConnection=DriverManager.getConnection(dbURL,strUserID,strPassword); 

      Statement sqlStatement = myConnection.createStatement(); 
      String readRecordSQL = "select * from sa_work_order where WORK_ORDER_NO = '1503090' "; 
      ResultSet myResultSet = sqlStatement.executeQuery(readRecordSQL); 
      while (myResultSet.next()) { 
       System.out.println("Record values: " + myResultSet.getString("WORK_ORDER_NO")); 
      } 
      myResultSet.close(); 
      myConnection.close(); 

     } catch (Exception e) { 
      System.out.println(e); 
     }  
    } 
} 
1

如果你使用eclipse來連接沒有SID的oracle。有兩種驅動程序可供選擇,即Oracle瘦驅動程序和其他驅動程序。選擇其他驅動程序並在數據庫列中輸入服務名稱。現在您可以直接使用服務名稱而不使用SID。

相關問題