Могу ли я указать имя пользователя и пароль для разных адресов в строке подключения oracle tns? - PullRequest
0 голосов
/ 02 апреля 2020

Справочная информация: Работа с базой данных Oracle 12cR2 и в этом конкретном решении нам нужна максимальная доступность. Мы используем Active-Active репликацию с Golden Gate. Локальные пользователи настроены для аутентификации. Мы настраиваем наших клиентов, чтобы иметь возможность бесперебойного переключения при отказе и аутентификации, мы вручную синхронизировали c пароли для одного и того же логического пользователя между экземплярами БД.

Постановка задачи: Есть ли способ иметь вид сбоя на стороне клиента (как показано ниже), но иметь возможность указать учетные данные пользователя для первичных и вторичных БД?

Наши учетные данные в настоящее время через установщик на PoolDataSource и Мне еще предстоит найти строковое свойство TNS, которое мы можем установить для имени пользователя / пароля.

    PoolDataSource poolDataSource = (PoolDataSourceImpl) PoolDataSourceFactory.getPoolDataSource();
    poolDataSource.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
    poolDataSource.setURL(url);
    poolDataSource.setUser(username);
    poolDataSource.setPassword(password);
    ...

На стороне клиента мы используем jar ojdbc8, ucp и ons:

    <dependency>
      <groupId>com.oracle.database</groupId>
      <artifactId>ojdbc8</artifactId>
      <version>12.2.0.1</version>
    </dependency>
    <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ucp</artifactId>
      <version>12.1.2-0-0</version>
    </dependency>
    <dependency>
      <groupId>com.oracle.weblogic</groupId>
      <artifactId>ons</artifactId>
      <version>12.1.2-0-0</version>
    </dependency>

Вот как выглядит наша строка подключения:

dbc:oracle:thin:@(
  DESCRIPTION_LIST=(LOAD_BALANCE=off)(FAILOVER=on)

  (DESCRIPTION=(CONNECT_TIMEOUT=3)(RETRY_COUNT=3)
  (ADDRESS_LIST=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=${primaryHostname)(PORT=1521)))
  (CONNECT_DATA=(SERVICE_NAME=${primaryServiceName)))

  (DESCRIPTION=
  (ADDRESS_LIST=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=${secondaryHostname })(PORT=1521)))
  (CONNECT_DATA=(SERVICE_NAME=${secondaryServiceName})))
)

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

tns (и я имею в виду весь прозрачный сетевой субстрат, а не только tnsnames.ora) касается только доставки сообщений по сети в базу данных oracle. Он не знает или не заботится о учетных данных пользователя базы данных. Фактически, к моменту представления учетных данных в базу данных, TNS уже выполнила свою работу и уже не в курсе. TNS доставляет запрос слушателю. В зависимости от того, что запрашивается, слушатель либо (а) порождает выделенный серверный процесс и сообщает клиенту, какой порт использовать для связи напрямую с этим сервером, либо (б) находит доступного диспетчера и сообщает клиенту, какой порт использовать для связи непосредственно с этим диспетчером. Как только это будет сделано, слушатель исчезнет, ​​и это будет либо выделенный сервер, либо диспетчер, который предоставит учетные данные для базы данных.

0 голосов
/ 03 апреля 2020

С драйвером Oracle JDB C URL-адрес JDB C может быть настроен на включение имени пользователя и пароля:

jdbc:oracle:thin:<user>/<password>@<database>

Где «база данных» может быть вашим адресом TNS.

Чтобы быть более точным, ваш URL JDB C может выглядеть следующим образом:

jdbc:oracle:thin:<user>/<password>@(DESCRIPTION_LIST=(LOAD_BALANCE=off)(FAILOVER=on).....)

И к тому, что написал @EdStevens, эта пара пользователя / пароля используется клиентом (JDB C - но это работает и в sqlplus) после того, как установлено соединение Net, другими словами, после того, как ваш клиент подключен к процессу переднего плана базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...