Подключение к кластеру Oracle в Java - PullRequest
4 голосов
/ 26 января 2010

У нас есть пара серверов Oracle, которые настроены как узлы в кластере (извините, если моя терминология не подходит). В моем файле tnsnames.ora есть запись, которая выглядит как

EXAMPLE.GOV =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.4)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.5)(PORT = 1521))
    (LOAD_BALANCE = yes)
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = example.gov)
    )
  )

, и это работает, когда я подключаюсь к программам, использующим файл tnsnames.ora. Однако у меня также есть Java-программа, которая использует класс oracle.jdbc.pool.OracleDataSource для установления соединения

.
public static Connection connect() throws Exception {
    OracleDataSource ods = new OracleDataSource();
    ods.setDriverType("thin");
    ods.setServerName("1.2.3.4");
    ods.setDatabaseName("example");
    ods.setPortNumber(1521);
    ods.setUser("scott");
    ods.setPassword("tiger");
    return ods.getConnection();
}

, который просто подключается к одному из узлов напрямую. Вместо этого я бы хотел использовать подход балансировки нагрузки tnsnames.ora, где он использует балансировку нагрузки или что-то еще для подключения к одному из узлов, так что если один из них не работает, он автоматически подключится к другому.

Поскольку у меня только два узла, я мог бы просто попытаться открыть соединение с первым узлом, а затем, если это не сработало, открыть соединение со вторым. Однако мне интересно, есть ли более правильный способ сделать это.

Я вижу, что есть параметр setTNSEntryName, но так как мой tnsnames.ora находится в нестандартном месте, мне нужно установить переменную окружения TNS_ADMIN, что я не уверен, что смогу сделать даже в Java. Также я не уверен, что это сработает в любом случае.

Кто-нибудь знает, как подключиться к кластеру узлов Oracle из Java-программы?

1 Ответ

9 голосов
/ 26 января 2010

Для тонкого драйвера Oracle JDBC, я думаю, это может работать как URL соединения:

jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)
(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.4) (PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.5) (PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=example.gov)))

Используйте метод setUrl для установки URL. Если задан URL-адрес, все остальные свойства, такие как имя базы данных, имя сервера, номер порта, сетевой протокол, tnsentry и тип драйвера, будут игнорироваться.

Надеюсь, это поможет!

...