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

251

Ich habe eine Java-Anwendung, die JDBC (über JPA) verwendet und über Hostname, Port und Oracle SID eine Verbindung zu einer Entwicklungsdatenbank herstellt:

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: thin: @ oracle.hostserver2.mydomain.ca: 1522: ABCD

ABCD ist der Dienstname der anderen Datenbank.

Was mache ich falsch?

Jim Tough
quelle

Antworten:

427

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

Syntax für dünne Dienstnamen

Thin-Style-Dienstnamen werden nur vom JDBC Thin-Treiber unterstützt. Die Syntax lautet:

@ // Hostname: Portnummer / Dienstname

Beispielsweise:

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

Also würde ich versuchen:

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

Gemäß der Antwort von Robert Greathouse können Sie den TNS-Namen auch 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)))
Bert F.
quelle
Können Sie den Punkt über das TNSNAMES-Format pro Antwort von @Robert Greathouse einbeziehen, um eine perfekte Antwort zu erzielen?
Alister Lee
Für mich hat es mit dem @ nicht funktioniert, ich musste jdbc: oracle: thin: // myhost: 1521 / myservicename verwenden, aber ich habe auch keine Benutzeranmeldeinformationen angegeben
Daniel
Ich habe versucht, mithilfe des JDBC-Thin-Treibers in Google App Script eine Verbindung zu Oracle herzustellen, und eine Reihe von Syntaxen ohne Erfolg ausprobiert. jdbc:oracle:thin:USER/PWD@//my.ip.address:1521/SERVICENAMEoder jdbc:oracle:thin:@//my.ip.address.1521/SERVICENAMEmit Benutzername und Passwort als Argumente für jdbc.getConnection(). Immer noch rätselhaft.
Benjamin
92

Es gibt also zwei einfache Möglichkeiten, um diese Arbeit zu machen. Die von Bert F bereitgestellte Lösung funktioniert einwandfrei, 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 Verbindungspooling durchführt). Das TNS-Format lautet:

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 dies bekannt vorkommen. Wenn nicht, dann googeln Sie einfach nach den Details.

Jim Tough
quelle
24

Sie können den TNS-Namen auch wie folgt in der JDBC-URL 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)))
Robert Greathouse
quelle
17

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

Bearbeiten: pro Kommentar unten ist dies tatsächlich richtig: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD(beachten Sie die// )

Hier ist ein Link zu einem hilfreichen Artikel

DwB
quelle
3
Das hat bei mir nicht funktioniert, ich musste es benutzen jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD.
WynandB
Also kann die IP hier statt verwendet werden oracle.hostserver2.mydomain.ca?
Benjamin
8

Diese Diskussion half mir, das Problem zu lösen, mit dem ich tagelang zu kämpfen hatte. Ich habe mich im Internet umgesehen, bis ich die Antwort von Jim Tough am 18. Mai 11 um 15:17 Uhr fand. Mit dieser Antwort konnte ich mich verbinden. Jetzt möchte ich etwas 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);
        }       
    }
}
Ed Chipeta
quelle
1

Falls Sie Eclipse verwenden, um Oracle ohne SID zu verbinden. Es stehen zwei Treiber zur Auswahl, nämlich der Oracle Thin-Treiber und der andere Treiber. Wählen Sie andere Treiber aus und geben Sie den Dienstnamen in die Datenbankspalte ein. Jetzt können Sie eine direkte Verbindung über den Dienstnamen ohne SID herstellen.

Bhagavathy Vinoth
quelle
Noch wichtiger ist, dass Sie damit die Verbindungs-URL im Gegensatz zum Thin Driver vollständig angeben können. Das Komische ist, dass Sie immer noch die Thin-Treiber-URL verwenden müssen, damit sie funktioniert (Thin-Style-Dienstnamen, die nur vom JDBC-Thin-Treiber unterstützt werden). Viele Beispiele hier gepostet.
Edi Bice
0

Bei Verwendung von daganstelle von thinhat die Syntax unten, die auf den Dienstnamen verweist, für mich funktioniert. Die jdbc:thinobigen Lösungen haben nicht funktioniert.

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
Syk Nar
quelle
1
Bitte erwägen Sie, Ihrer Antwort weitere Informationen hinzuzufügen, die etwas mehr darüber beschreiben, was funktioniert hat / was nicht - was haben Sie beobachtet oder wussten, warum dies funktioniert?
AJD
1
Bemerkenswert ist - Sie verwenden einen bestimmten Treiber. Der Versuch, den Thin-Treiber von Oracle zu verwenden, gibt Folgendes zurück: Für jdbc: dag: oracle: //
access_granted wurde
0

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

Kamesh Murali
quelle
1
Fehler: "Ungültige Oracle-URL angegeben", 11g / ojdbc7-Kombination.
access_granted