У нас есть пара серверов 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-программы?