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?

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

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.


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

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


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);
        }       
    }
}

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.


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

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


1
Fehler: "Ungültige Oracle-URL angegeben", 11g / ojdbc7-Kombination.
access_granted
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.