Java JDBC – Como se conectar ao Oracle usando o nome do serviço em vez do SID

Eu tenho um aplicativo Java que usa JDBC (via JPA) que estava se conectando a um database de desenvolvimento usando hostname, port e Oracle SID, assim:

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

XYZ foi o Oracle SID. Agora preciso conectar-me a um database Oracle diferente que não use um SID, mas use um “Nome do Serviço” do Oracle.

Eu tentei isso, mas não funciona:

jdbc: oracle: thin: @ oracle.hostserver2.mydomain.ca: 1522: ABCD

ABCD é o nome do serviço do outro database.

O que estou fazendo de errado?

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

Sintaxe de nome de serviço de estilo fino

Nomes de serviço de estilo fino são suportados apenas pelo driver JDBC Thin. A syntax é:

@ // host_name: port_number / service_name

Por exemplo:

jdbc: oracle: fino: scott / tiger @ // myhost: 1521 / myservicename

Então eu tentaria:

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

Além disso, segundo a resposta de Robert Greathouse, você também pode especificar o nome do TNS no URL do JDBC, conforme abaixo:

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))) 

Portanto, existem duas maneiras fáceis de fazer isso funcionar. A solução postada por Bert F funciona bem se você não precisa fornecer quaisquer outras propriedades de conexão especiais específicas do Oracle. O formato para isso é:

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

No entanto, se você precisar fornecer outras propriedades de conexão específicas do Oracle, será necessário usar o estilo TNSNAMES longo. Eu tive que fazer isso recentemente para permitir conexões compartilhadas do Oracle (onde o servidor faz seu próprio pool de conexão). O formato TNS é:

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

Se você estiver familiarizado com o formato de arquivo Oracle TNSNAMES, isso deve parecer familiar para você. Se não, então apenas Google para os detalhes.

Você também pode especificar o nome do TNS no URL do JDBC como abaixo

 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))) 

Tente isto: jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522/ABCD

Edit: por comentário abaixo este é realmente correto: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD (note o // )

Aqui está um link para um artigo útil

Essa discussão me ajudou a resolver o problema com o qual eu estava lutando durante dias. Eu olhei ao redor de toda a internet até que encontrei a resposta de Jim Tough em 18 de maio ’11 às 15:17. Com essa resposta, consegui me conectar. Agora quero devolver e ajudar os outros com um exemplo completo. Aqui vai:

 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); } } } 

Caso você esteja usando o eclipse para conectar o oracle sem o SID. Existem dois drivers para selecionar ou seja, o driver fino do Oracle e outro é outro driver. Selecione outros drivers e insira o nome do serviço na coluna do database. Agora você pode se conectar diretamente usando o nome do serviço sem o SID.

Ao usar dag vez de thin , a syntax abaixo apontando para o nome do serviço funcionou para mim. O jdbc:thin solutions acima não funcionou.

 jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME 
Intereting Posts