it-swarm.com.de

Java JDBC - Herstellen einer Verbindung zu Oracle unter Verwendung des Dienstnamens anstelle der SID

Ich habe eine Java-Anwendung, die JDBC (über JPA) verwendet und eine Verbindung mit einer Entwicklungsdatenbank über Hostname, Port und Oracle-SID herstellte.

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

XYZ war die Oracle-SID. Jetzt muss ich eine Verbindung zu einer anderen Oracle-Datenbank herstellen, die keine SID verwendet, sondern stattdessen einen Oracle "Service Name" verwendet.

Ich habe es versucht, aber es funktioniert nicht:

jdbc: Oracle: dünn: @ Oracle.hostserver2.mydomain.ca: 1522: ABCD

ABCD ist der Dienstname der anderen Datenbank.

Was mache ich falsch?

215
Jim Tough

http://download.Oracle.com/docs/cd/B28359_01/Java.111/b31224/urls.htm#BEIDHCBA

Schlanke Dienstnamensyntax

Thin-Service-Namen werden nur vom JDBC-Thin-Treiber unterstützt. Die Syntax lautet:

@ // Hostname: Portnummer/Servicename

Zum Beispiel:

jdbc: Oracle: dünn: scott/tiger @ // myhost: 1521/meinervicename

Also würde ich versuchen:

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

Gemäß der Antwort von Robert Greathouse können Sie auch den TNS-Namen in der JDBC-URL wie folgt angeben:

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)))
379
Bert F

Es gibt also zwei einfache Möglichkeiten, dies zu erreichen. Die von Bert F bereitgestellte Lösung funktioniert gut, wenn Sie keine anderen speziellen Oracle-spezifischen Verbindungseigenschaften angeben müssen. Das Format dafür ist:

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

Wenn Sie jedoch andere Oracle-spezifische Verbindungseigenschaften angeben müssen, müssen Sie den langen TNSNAMES-Stil verwenden. Ich musste dies kürzlich tun, um gemeinsam genutzte Oracle-Verbindungen zu aktivieren (wobei der Server sein eigenes Verbindungs-Pooling ausführt). Das TNS-Format ist:

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

Wenn Sie mit dem Oracle-TNSNAMES-Dateiformat vertraut sind, sollte Ihnen dieses bekannt vorkommen. Wenn nicht, dann einfach Google für die Details.

84
Jim Tough

Sie können den TNS-Namen auch in der JDBC-URL wie unten angegeben angeben

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

Versuchen Sie folgendes: jdbc:Oracle:thin:@Oracle.hostserver2.mydomain.ca:1522/ABCD

Edit: pro Kommentar darunter ist dies eigentlich korrekt: jdbc:Oracle:thin:@//Oracle.hostserver2.mydomain.ca:1522/ABCD (beachte den //)

Hier ist ein Link zu einem hilfreichen Artikel

13
DwB

Diese Diskussion half mir, das Problem zu lösen, mit dem ich seit Tagen zu kämpfen hatte. Ich habe mich im Internet umgesehen, bis ich am 18. Mai 11 um 15:17 Uhr die Antwort von Jim Tough fand. Mit dieser Antwort konnte ich mich verbinden. Jetzt möchte ich zurückgeben und anderen mit einem vollständigen Beispiel helfen. Hier geht:

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
Ed Chipeta

Falls Sie Eclipse verwenden, um Oracle ohne SID zu verbinden. Es gibt zwei Treiber zur Auswahl, d. H. Oracle Thin-Treiber und andere Treiber. Wählen Sie andere Treiber aus und geben Sie den Dienstnamen in die Datenbankspalte ein. Jetzt können Sie direkt mit dem Servicenamen ohne SID eine Verbindung herstellen.

1

Wenn Sie dag anstelle von thin verwenden, funktionierte die folgende Syntax, die auf den Dienstnamen verweist, für mich. Die oben genannten jdbc:thin-Lösungen haben nicht funktioniert.

jdbc:dag:Oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
0
Syk Nar

Das sollte funktionieren: jdbc:Oracle:thin//hostname:Port/ServiceName=SERVICE_NAME

0
Kamesh Murali