J'ai une application Java qui utilise JDBC (via JPA) et qui se connectait à une base de développement en utilisant hostname, port et Oracle SID, comme ceci:
jdbc: Oracle: thin: @ Oracle.hostserver1.mydomain.ca: 1521: XYZ
XYZ était le SID Oracle. Maintenant, je dois me connecter à une autre base de données Oracle qui n'utilise pas d'identificateur de sécurité, mais utilise un "nom de service" Oracle.
J'ai essayé ça mais ça ne marche 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?
http://download.Oracle.com/docs/cd/B28359_01/Java.111/b31224/urls.htm#BEIDHCBA
Syntaxe de nom de service de style fin
Les noms de service de style fin ne sont pris en charge que par le pilote JDBC Thin. La syntaxe est la suivante:
@ // nom_hôte: numéro_port/nom_service
Par exemple:
jdbc: Oracle: thin: scott/tiger @ // myhost: 1521/nom_serveur
Donc j'essayerais:
jdbc: Oracle: thin: @ // Oracle.hostserver2.mydomain.ca:1522/ABCD
En outre, selon la réponse de Robert Greathouse, vous pouvez également spécifier le nom TNS dans l'URL JDBC comme suit:
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)))
Donc, il y a deux façons faciles de faire ce travail. La solution publiée par Bert F fonctionne bien si vous n'avez pas besoin de fournir d'autres propriétés de connexion spécifiques à Oracle. Le format pour cela 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 TNSNAMES long. Je devais le faire récemment pour activer les connexions partagées Oracle (où le serveur effectue son propre regroupement de connexions). Le format TNS est:
jdbc:Oracle:thin:@(description=(address=(Host=HOSTNAME)(protocol=tcp)(port=PORT))(connect_data=(service_name=SERVICENAME)(server=SHARED)))
Si vous connaissez le format de fichier Oracle TNSNAMES, cela devrait vous paraître familier. Si ce n'est pas le cas, cherchez simplement Google dans les détails.
Vous pouvez également spécifier le nom TNS dans l'URL JDBC comme indiqué 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 avec lequel je me débattais pendant des jours. J'ai regardé partout sur Internet jusqu'à ce que j'ai trouvé la réponse de Jim Tough le 18 mai 2011 à 15h17. Avec cette réponse, j'ai pu me connecter. Maintenant, je veux redonner et aider les autres avec un exemple complet. Voici:
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 connecter Oracle sans SID. Il existe deux pilotes pour sélectionner le pilote léger Oracle et l’autre pilote. Sélectionnez d'autres pilotes et entrez le nom du service dans la colonne de la base de données. Maintenant, vous pouvez vous connecter directement en utilisant le nom du service sans SID.
Lorsque vous utilisez dag
au lieu de thin
, la syntaxe ci-dessous indiquant le nom du service a fonctionné pour moi. Les solutions jdbc:thin
ci-dessus ne fonctionnaient pas.
jdbc:dag:Oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
Cela devrait fonctionner: jdbc:Oracle:thin//hostname:Port/ServiceName=SERVICE_NAME