Oracle UCP - Поддержка плановых отключений FCF - PullRequest
1 голос
/ 17 февраля 2012

Я тестирую поддержку Fast Connection Failover (FCF) из Oracle Universal Connection Pool (UCP) версии 11.2.0.1.0. Испрашиваемый сценарий является запланированным событием отключения. Стандартная версия Oracle Database 11g Release 11.2.0.2.0 - это используемая версия базы данных. Ниже приведены шаги, которые я выполняю в своем тесте

  1. Получить соединение и распечатать экземпляр, к которому оно подключено
  2. Выполнить "srvctl stop instance -d -n" на одном из узлов
  3. Выполнить запрос на соединение, полученное на первом шаге.

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;
        }

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Мне удалось протестировать поддержку UCP для FCF с двумя изменениями

  1. Создание нового сервиса. Служба, использованная в начальной попытке, была службой по умолчанию, и функция FCF не работает со службой по умолчанию, как указано здесь в примечании.

  2. Остановка службы вместо экземпляра. Остановка экземпляра будет имитировать незапланированное отключение вместо запланированного.

1 голос
/ 17 февраля 2012

Если вы выполните НОРМАЛЬНОЕ ОТКЛЮЧЕНИЕ , а затем завершите транзакцию, будет ли ваше приложение работать корректно?

Похоже, srvctl stop instance -d XXX -n YYY -o normal должен сделать это.

Этот поток предлагает использовать по умолчанию метод выключения srvctl, который объясняет, что вы видите.

...