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?7 answers
Http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/urls.htm#BEIDHCBA
Então eu faria tente: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
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)))
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.
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)))
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
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);
}
}
}
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