Java JDBC - Как подключиться к Oracle, используя имя службы вместо SID
У меня есть Java-приложение, которое использует JDBC (через JPA), которое подключалось к базе данных разработки с использованием имени хоста, порта и Oracle SID, например:
JDBC: оракул: тонкий: @ oracle.hostserver1.mydomain.ca: 1521: XYZ
XYZ был SID Oracle. Теперь мне нужно подключиться к другой базе данных Oracle, которая не использует SID, но вместо этого использует Oracle "Service Name".
Я пробовал это, но это не работает:
JDBC: оракул: тонкий: @ oracle.hostserver2.mydomain.ca: 1522: ABCD
ABCD - сервисное имя другой базы данных.
Что я делаю неправильно?
7 ответов
http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/urls.htm
Синтаксис имени службы в тонком стиле
Имена сервисов в тонком стиле поддерживаются только тонким драйвером JDBC. Синтаксис:
@// host_name: port_number / service_name
Например:
JDBC: оракул: тонкий: Скот / тигр @// MyHost:1521/myservicename
Поэтому я бы попробовал:
JDBC: оракул: тонкий:@//oracle.hostserver2.mydomain.ca:1522/ABCD
Кроме того, согласно ответу Роберта Грейтхауса, вы также можете указать имя TNS в URL JDBC, как показано ниже:
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)))
Таким образом, есть два простых способа сделать эту работу. Решение, опубликованное Bert F, отлично работает, если вам не нужно предоставлять какие-либо другие специфические свойства соединения Oracle. Формат для этого:
jdbc:oracle:thin:@//HOSTNAME:PORT/SERVICENAME
Однако, если вам нужно предоставить другие специфичные для Oracle свойства соединения, вам нужно использовать длинный стиль TNSNAMES. Мне пришлось сделать это недавно, чтобы включить общие подключения Oracle (где сервер выполняет свой пул соединений). Формат TNS:
jdbc:oracle:thin:@(description=(address=(host=HOSTNAME)(protocol=tcp)(port=PORT))(connect_data=(service_name=SERVICENAME)(server=SHARED)))
Если вы знакомы с форматом файлов Oracle TNSNAMES, это должно показаться вам знакомым. Если нет, то просто Google это для деталей.
Вы также можете указать имя TNS в URL JDBC, как показано ниже
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)))
Попробуй это: jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522/ABCD
Изменить: для комментария ниже это действительно правильно: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD
(Обратите внимание //
)
Вот ссылка на полезную статью
Это обсуждение помогло мне решить проблему, с которой я боролся в течение нескольких дней. Я осматривал весь интернет, пока не нашел ответ Джима Тафа 18 мая 11 года в 15:17. С этим ответом я смог соединиться. Теперь я хочу вернуть и помочь другим с полным примером. Вот оно:
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);
}
}
}
В случае, если вы используете Eclipse для подключения оракула без SID. Есть два драйвера для выбора, т.е. тонкий драйвер Oracle, а другой - другой драйвер. Выберите другие драйверы и введите имя службы в столбце базы данных. Теперь вы можете подключиться напрямую, используя имя сервиса без SID.
Когда используешь dag
вместо thin
Синтаксис ниже, указывающий на имя сервиса, работал для меня. jdbc:thin
Решения выше не сработали.
jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
Это должно работать: jdbc:oracle:thin//hostname:Port/ServiceName=SERVICE_NAME