Java JDBC - Comment se connecter à Oracle en utilisant Nom du service au lieu de SID
-
27-10-2019 - |
Question
J'ai une application Java qui utilise JDBC (via JPA) qui a été connecter à une base de développement en utilisant le nom d'hôte, le port et Oracle SID, comme ceci:
jdbc: oracle: thin: @ oracle.hostserver1.mydomain.ca: 1521: XYZ
XYZ a été le SID Oracle. Maintenant, je dois vous connecter à une autre base de données Oracle qui n'utilise pas un SID, mais utilise un Oracle « Nom du service » à la place.
J'ai essayé, mais il ne fonctionne pas:
jdbc: oracle: thin: @ oracle.hostserver2.mydomain.ca: 1522: ABCD
ABCD est le nom de service de l'autre base de données.
Qu'est-ce que je fais mal?
La solution
http://download.oracle. com / docs / cd / B28359_01 / java.111 / b31224 / URLs.htm # BEIDHCBA
Service de style Thin Nom Syntaxe
Les noms de services de style mince sont pris en charge que par le pilote Thin JDBC. La syntaxe est:
@ // nom_hôte: numéro_port / nom_service
Par exemple:
jdbc: oracle: thin: scott / tigre @ // myhost: 1521 / myservicename
Je voudrais essayer:
jdbc: oracle: thin: @ // oracle.hostserver2.mydomain.ca:1522/ABCD
En outre, par la réponse de Robert Greathouse, vous pouvez également spécifier le nom de TNS dans l'URL JDBC comme ci-dessous:
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)))
Autres conseils
Donc, il y a deux façons simples de faire ce travail. La solution affichée par Bert F fonctionne très bien si vous n'avez pas besoin de fournir d'autres propriétés de connexion spéciales spécifiques à Oracle. Le format de c'est:
jdbc:oracle:thin:@//HOSTNAME:PORT/SERVICENAME
Toutefois, si vous devez fournir d'autres propriétés de connexion spécifiques à Oracle, vous devez utiliser le style long TNSNAMES. Je devais le faire récemment pour permettre des connexions partagées Oracle (où le serveur fait sa propre mise en commun de connexion). Le format TNS est:
jdbc:oracle:thin:@(description=(address=(host=HOSTNAME)(protocol=tcp)(port=PORT))(connect_data=(service_name=SERVICENAME)(server=SHARED)))
Si vous êtes familier avec le format de fichier Oracle TNSNAMES, cela devrait vous être familier. Sinon, il suffit de Google pour les détails.
Vous pouvez également spécifier le nom TNS dans l'URL JDBC comme ci-dessous
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)))
Cette discussion m'a aidé à résoudre le problème que je luttais avec des jours. Je regardais autour de tous sur Internet jusqu'à ce que je le répondu par Jim dur le 18 mai '11 à 15h17. Avec cette réponse, j'ai pu se connecter. Maintenant, je veux donner en retour et aider les autres avec un exemple complet. Ici va:
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);
}
}
}
Si vous utilisez Eclipse pour Oracle connecter sans SID. Il y a deux pilotes pour sélectionner à savoir, le pilote mince Oracle et d'autres est un autre pilote. Sélectionnez d'autres pilotes et entrez le nom du service dans la colonne de base de données. Maintenant, vous pouvez vous connecter directement en utilisant le nom de service sans SID.
Lors de l'utilisation dag
au lieu de thin
, la syntaxe ci-dessous indiquant le nom du service a fonctionné pour moi. Les solutions de jdbc:thin
ci-dessus ne fonctionne pas.
jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
Cela devrait travailler: jdbc:oracle:thin//hostname:Port/ServiceName=SERVICE_NAME