Java JDBC - как подключиться к Oracle, используя имя службы вместо SID



У меня есть приложение Java, которое использует JDBC (через JPA), которое подключалось к базе данных разработки с использованием имени хоста, порта и Oracle SID, например:



jdbc:oracle:thin:@oracle.hostserver1.mydomain.ca:1521:XYZ



XYZ был оракулом SID. Теперь мне нужно подключиться к другой базе данных Oracle, которая не использует SID, но вместо этого использует имя службы Oracle.



Я пробовал это, но это не работа:



jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522:ABCD



ABCD-это имя Службы другой базы данных.



Что я делаю не так?

1366   7  

7 ответов:

http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/urls.htm#BEIDHCBA

синтаксис имени службы в тонком стиле

имена служб в тонком стиле поддерживаются только драйвером JDBC Thin. Синтаксис:

@ / / host_name: port_number / service_name

например:

jdbc:oracle:thin:scott/tiger@//myhost:1521/myservicename

поэтому я бы попробовал:

jdbc:oracle:thin:@//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 shared connections (где сервер делает свой собственный пул соединений). Формат 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

Edit: за комментарий ниже это действительно правильно: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 для подключения oracle без SID. Есть два драйвера для выбора, т. е. Oracle thin driver и другой-это другой драйвер. Выберите другие драйверы и введите имя службы в столбце база данных. Теперь вы можете подключиться напрямую, используя имя службы без SID.

при использовании dag вместо thin, синтаксис ниже, указывающий на имя службы, работал для меня. Элемент jdbc:thin выше решения не работают.

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME

Comments

    Ничего не найдено.