Java JDBC - Wie man mit dem Dienstnamen anstelle von SID eine Verbindung zum Oracle herstellt
-
27-10-2019 - |
Frage
Ich habe eine Java -Anwendung, die JDBC (über JPA) verwendet, die mit Hostname, Port und Oracle Sid eine Verbindung zu einer Entwicklungsdatenbank herstellt, wie folgt:
JDBC: Oracle: dünn:@oracle.hostserver1.mydomain.ca: 1521: xyz
XYZ war der Oracle Sid. Jetzt muss ich eine Verbindung zu einer anderen Oracle -Datenbank herstellen, in der kein SID verwendet wird, sondern stattdessen einen Oracle -Dienstnamen 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?
Lösung
http://download.oracle.com/docs/cd/b28359_01/java.111/b31224/urls.htm#beidhcba
Dünnstil-Dienstname Syntax
Die Namensnamen im dünnen Stil werden nur vom JDBC Thin Triver unterstützt. Die Syntax ist:
@// host_name: port_number/service_name
Zum Beispiel:
JDBC: Oracle: Thin: Scott/Tiger@// myhost: 1521/myServiceName
Also würde ich versuchen:
JDBC: Oracle: dünn:@// oracle.hostserver2.mydomain.ca:1522/abcd
Laut der Antwort von Robert Greathouse können Sie auch den TNS -Namen in der JDBC -URL wie unten 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)))
Andere Tipps
Es gibt also zwei einfache Möglichkeiten, um diese Arbeit zu machen. Die von Bert F veröffentlichte Lösung funktioniert gut, wenn Sie keine anderen speziellen oraklerspezifischen Verbindungseigenschaften liefern müssen. Das Format dafür ist:
jdbc:oracle:thin:@//HOSTNAME:PORT/SERVICENAME
Wenn Sie jedoch andere orakelspezifische Verbindungseigenschaften liefern müssen, müssen Sie den langen TNSnames-Stil verwenden. Ich musste dies kürzlich tun, um Oracle Shared Verbindungen zu ermöglichen (wobei der Server seine eigene 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 dies Ihnen bekannt sein. Wenn nicht, goog es einfach für die Details.
Sie können auch den TNS -Namen in der JDBC -URL wie unten 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)))
Versuche dies: jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522/ABCD
Bearbeiten: Per Kommentar unten ist tatsächlich richtig: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD
(beachten Sie das //
)
Hier ist ein Verknüpfung zu einem hilfreichen Artikel
Diese Diskussion half mir, das Problem zu lösen, mit dem ich tagelang zu kämpfen hatte. Ich sah mich im ganzen Internet um, bis ich die von Jim hart am 18. Mai 11 um 15:17 Uhr fand. Mit dieser Antwort konnte ich eine Verbindung herstellen. 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);
}
}
}
Falls Sie Eclipse verwenden, um Oracle ohne SID zu verbinden. Es gibt zwei Treiber, die IE auswählen können, Oracle Thin Triver und ein anderer Treiber. Wählen Sie andere Treiber aus und geben Sie den Dienstnamen in der Datenbankspalte ein. Jetzt können Sie direkt mit dem Servicenamen ohne SID eine Verbindung herstellen.
Beim Benutzen dag
Anstatt von thin
, Die folgende Syntax, die auf den Dienstnamen zeigt, funktionierte für mich. Das jdbc:thin
Lösungen oben funktionierten nicht.
jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
Dies sollte funktionieren: jdbc:oracle:thin//hostname:Port/ServiceName=SERVICE_NAME