Java JDBC - comment se connecter à Oracle en utilisant le nom du Service au lieu de SID
J'ai une application Java qui utilise JDBC (via JPA) qui se connectait à une base de données de développement en utilisant hostname, port et Oracle SID, comme ceci:
Jdbc:oracle:thin:@oracle.hostserver1.mydomain.ca:1521:XYZ
XYZ était L'Oracle SID. Maintenant, je dois me connecter à une base de données Oracle différente qui n'utilise pas de SID, mais utilise un "nom de Service" Oracle à la place.
J'ai essayé ceci mais ce n'est pas le cas travail:
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 de mal?
7 réponses
Http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/urls.htm#BEIDHCBA
syntaxe de nom de Service de style mince
Les noms de service de style Thin sont pris en charge uniquement par le pilote Thin JDBC. La syntaxe est:
@ / / host_name: port_number / service_name
Par exemple:
Jdbc:oracle:thin:scott/tiger@//myhost:1521/myservicename
Donc je voudrais essayez:
jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD
Aussi, selon la réponse de Robert Greathouse, 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)))
Il y a donc deux façons simples de faire ce travail. La solution publiée par Bert F fonctionne correctement 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. J'ai dû le faire récemment pour activer les connexions partagées Oracle (où le serveur fait son propre pool 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 êtes familier avec le format de fichier Oracle TNSNAMES, alors cela devrait vous sembler 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 avec lequel je luttais pendant des jours. J'ai regardé partout sur internet jusqu'à ce que je trouve la réponse de Jim Tough le mai 18 '11 à 15:17. Avec cette réponse, j'ai été en mesure de se 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);
}
}
}
Dans le cas où vous utilisez eclipse pour connecter oracle sans SID. Il y a deux conducteurs de choisir c'est à dire, Oracle mince conducteur et l'autre est l'autre conducteur. Sélectionnez d'autres pilotes et entrez le nom du service dans la colonne 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 pointant vers le nom du service a fonctionné pour moi. Les solutions jdbc:thin
ci-dessus n'ont pas fonctionné.
jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME