Java JDBC - Como se conectar ao Oracle usando o Nome do Serviço em vez do SID

251

Eu tenho um aplicativo Java que usa JDBC (via JPA) que estava se conectando a um banco de dados de desenvolvimento usando nome do host, porta e SID do Oracle, assim:

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

XYZ era o SID do Oracle. Agora, preciso conectar-me a um banco de dados 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 banco de dados.

O que estou fazendo de errado?

Jim Tough
fonte

Respostas:

427

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

Sintaxe de nome de serviço em estilo fino

Os nomes de serviço em estilo thin são suportados apenas pelo driver JDBC Thin. A sintaxe é:

@ // host_name: port_number / service_name

Por exemplo:

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

Então, eu tentaria:

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 na 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)))
Bert F
fonte
Você pode incorporar o argumento sobre o formato TNSNAMES por resposta do @Robert Greathouse para alcançar a perfeição das respostas?
Alister Lee
Para mim, não fez trabalho com o @, eu tive que usar jdbc: oracle: thin: // myhost: 1521 / myservicename, mas também eu não fornecer credenciais do usuário
Daniel
Eu tenho tentado descobrir como se conectar ao Oracle usando o driver thin JDBC no Google App Script e tentei várias sintaxes sem sucesso. jdbc:oracle:thin:USER/PWD@//my.ip.address:1521/SERVICENAMEou jdbc:oracle:thin:@//my.ip.address.1521/SERVICENAME, com nome de usuário e senha como argumentos para jdbc.getConnection(). Ainda intrigante.
Benjamin
92

Portanto, existem duas maneiras fáceis de fazer isso funcionar. A solução publicada por Bert F funciona bem se você não precisar fornecer outras propriedades especiais de conexão 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, precisará usar o estilo TNSNAMES longo. Eu tive que fazer isso recentemente para habilitar conexões compartilhadas Oracle (onde o servidor faz seu próprio pool de conexões). O formato TNS é:

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, isso deve lhe parecer familiar. Caso contrário, basta pesquisar no Google para obter detalhes.

Jim Tough
fonte
24

Você também pode especificar o nome do TNS na URL 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)))
Robert Greathouse
fonte
17

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

Editar: por comentário abaixo, isso está realmente correto: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD(observe o //)

Aqui está um link para um artigo útil

DwB
fonte
3
Isso não funcionou para mim, eu tive que usar jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD.
WynandB
Então o IP pode ser usado aqui em vez de oracle.hostserver2.mydomain.ca?
Benjamin
8

Essa discussão me ajudou a resolver o problema com o qual estava lutando há dias. Olhei em toda a Internet até encontrar a resposta de Jim Tough em 18 de maio de 11 às 15:17. Com essa resposta eu consegui me conectar. 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);
        }       
    }
}
Ed Chipeta
fonte
1

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

Bhagavathy Vinoth
fonte
Mais importante, isso permite que você especifique completamente o URL da conexão, diferente do Thin Driver. O engraçado é que você ainda precisa usar a URL do driver thin para fazê-lo funcionar (nomes de serviço de estilo thin suportados apenas pelo driver thin JDBC). Muitos exemplos publicados aqui.
Edi Bice
0

Ao usar em dagvez de thin, a sintaxe abaixo, apontando para o nome do serviço, funcionou para mim. As jdbc:thinsoluções acima não funcionaram.

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
Syk Nar
fonte
1
Por favor, considere adicionar mais algumas informações à sua resposta, descrevendo um pouco mais sobre o que funcionou / não funcionou - o que você observou ou sabia por que isso funciona?
AJD 27/07
1
Vale a pena notar - você está usando um driver específico. Tentativa de usar o driver thin do Oracle retorna: Nenhum driver adequado foi encontrado para jdbc: dag: oracle: //
access_granted
0

Isso deve estar funcionando: jdbc:oracle:thin//hostname:Port/ServiceName=SERVICE_NAME

Kamesh Murali
fonte
1
Erro: "URL Oracle inválido especificado", combinação 11g / ojdbc7.
access_granted 23/04