JDBC Java-como se ligar à Oracle usando o nome do serviço em vez do SID

Tenho uma aplicação Java que usa o JDBC (via JPA) que estava a ligar-se a uma base de dados de desenvolvimento usando o hostname, o port e o Oracle SID, do seguinte modo:

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

XYZ era o oráculo SID. Agora eu preciso me conectar a um banco de Dados Oracle diferente que não usa um SID, mas usa um Oracle "nome de serviço" em vez disso.

Tentei isto, mas não funciona. trabalho:

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

ABCD é o nome de Serviço da outra base de dados.

O que estou a fazer de errado?

Author: Jim Tough, 2011-01-28

7 answers

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

sintaxe do nome de Serviço Thin-style

Os nomes dos serviços em estilo fino são suportados apenas pelo controlador fino JDBC. A sintaxe é:

@ / / host_name:port_ número / nome_ serviço

Por exemplo:

Jdbc:oracle:thin:scott/tiger@//myhost:1521/myservicename

Então eu faria tente:

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

Além disso, de acordo com a resposta de Robert Greathouse, 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)))
 356
Author: Bert F, 2018-02-19 05:43:31
Então há duas maneiras fáceis de fazer isto funcionar. A solução postada por Bert F funciona bem se você não precisa fornecer quaisquer outras propriedades especiais de conexão Oracle-específicas. O formato para isso é:
jdbc:oracle:thin:@//HOSTNAME:PORT/SERVICENAME

No entanto, se você precisa fornecer outras propriedades de conexão específicas do Oracle, então você precisa usar o estilo de TNSNAMES longos. Eu tive que fazer isso recentemente para permitir conexões compartilhadas Oracle (onde o servidor faz seu próprio pooling de conexão). O formato TNS riz:

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

Se você está familiarizado com o formato de arquivo Oracle TNSNAMES, então isso deve parecer familiar para você. Se não, então basta pesquisar no Google para os detalhes.

 81
Author: Jim Tough, 2018-05-16 12:52:43

Você também pode indicar o nome do TNS no URL do JDBC como em baixo

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)))
 21
Author: Robert Greathouse, 2013-10-31 08:52:12
Tenta isto.: jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522/ABCD

Editar: Por comentário abaixo esta é actualy correct: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD (note o //)

Aqui está uma ligação a um artigo útil

 12
Author: DwB, 2018-03-29 08:05:56
Esta discussão ajudou-me a resolver o problema com que me debati durante dias. Procurei por toda a internet até encontrar a resposta do Jim Tough em 18 de Maio de 11 às 15:17. Com essa resposta, consegui ligar-me. Agora quero retribuir 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);
        }       
    }
}
 6
Author: Ed Chipeta, 2015-10-19 11:15:48
Caso estejas a usar o eclipse para ligar a oracle sem o SID. Existem dois drivers para selecionar isto é, Oracle thin driver e outro é outro driver. Seleccione outros controladores e indique o nome do serviço na coluna da base de dados. Agora você pode se conectar diretamente usando o nome do serviço sem SID.
 1
Author: Bhagavathy Vinoth, 2016-05-24 12:12:23

Ao usar dag em vez de thin, a sintaxe abaixo a apontar para o nome do serviço funcionou para mim. As soluções acima referidas não funcionaram.

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
 0
Author: Syk Nar, 2018-07-28 00:10:01