Я тестирую поддержку Fast Connection Failover (FCF) из Oracle Universal Connection Pool (UCP) версии 11.2.0.1.0. Испрашиваемый сценарий является запланированным событием отключения. Стандартная версия Oracle Database 11g Release 11.2.0.2.0 - это используемая версия базы данных. Ниже приведены шаги, которые я выполняю в своем тесте
- Получить соединение и распечатать экземпляр, к которому оно подключено
- Выполнить "srvctl stop instance -d -n" на одном из узлов
- Выполнить запрос на соединение, полученное на первом шаге.
3-й шаг завершается неудачно с ошибкой (ORA-03113: конец файла в канале связи), когда этого не происходит, поскольку это запланированное событие отключения. Анализируя журналы ucp, я мог видеть, что событие FAN получено клиентом jdbc и обработано, помечая состояние соединения как «STATUS_CLOSE_ON_RETURN», но все равно выполнить запрос с использованием этого заимствованного соединения не удается.
Ожидаемый результат - любые запросы, выполняемые на заимствованных соединениях, выполняются успешно, и соединение остается действительным, пока оно не будет возвращено обратно в пул. Это должно быть закрыто бассейном после этого. Команда останова экземпляра не должна быть успешной, пока это не будет сделано.
Что-то мне не хватает в конфигурации? Является ли приведенная выше команда srvctl правильной?
Конфигурация пула Oracle выглядит следующим образом
PoolDataSourceImpl pds = new PoolDataSourceImpl();
try {
pds.setConnectionPoolName("Connection Pool");
pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setConnectionFactoryProperties(getOracleDataSourceProperties());
pds.setDataSourceName("DataSource");
pds.setServerName(SERVER_NAME);
pds.setUser("system");
pds.setPassword("pass");
pds.setPortNumber(1521);
pds.setMinPoolSize(0);
pds.setMaxPoolSize(25);
pds.setMaxIdleTime(1800);
pds.setValidateConnectionOnBorrow(true);
pds.setONSConfiguration("nodes=v-ind-db-11g-01:6200,v-ind-db-11g-02:6200");
pds.setFastConnectionFailoverEnabled(true);
pds.setInactiveConnectionTimeout(20);
pds.setConnectionWaitTimeout(20);
pds.setPropertyCycle(60);
pds.startPool();
} catch (SQLException e) {
throw new RuntimeException("Cannot create project datasource", e);
}
.......
Properties getOracleDataSourceProperties() {
Properties p = new Properties();
p.put("driverType", "oci");
p.put("networkProtocol", "tcp");
p.put("serviceName", SERVICE_NAME);
return p;
}