Непрерывность приложений с помощью универсального пула соединений Java JDBC Oracle 12c

2

Я пытаюсь добиться непрерывности приложений с базой данных Oracle 12c и Oracle UCP (Universal Connection Pool). Согласно официальной документации, я применил следующее в своей заявке. Я использую ojdbc8.jar вместе с эквивалентом ons.jar и ucp.jar в своем приложении.

PoolDataSource  pds = oracle.ucp.jdbc.PoolDataSourceFactory.getPoolDataSource();

Свойства согласно документации оракула:

pds.setConnectionFactoryClassName("oracle.jdbc.replay.OracleDataSourceImpl");
pds.setUser("username");
pds.setPassword("password");
pds.setInitialPoolSize(10);
pds.setMinPoolSize(10);
pds.setMaxPoolSize(20);
pds.setFastConnectionFailoverEnabled(true);
pds.setONSConfiguration("nodes=IP_1:ONS_PORT_NUMBER,IP_2:ONS_PORT_NUMBER");
pds.setValidateConnectionOnBorrow(true);
pds.setURL("jdbc:oracle:thin:@my_scan_name.my_domain_name.com:PORT_NUMBER/my_service_name");
// I have also tried using the TNS-Like URL as well. //

Тем не менее, я не могу добиться непрерывности приложений. У меня есть некоторые потоковые транзакции, которые я ожидаю воспроизвести, когда я сниму узел RAC, на котором работает моя служба базы данных. Я наблюдаю, что моя служба переносится на следующий доступный узел RAC в кластере, однако мои транзакции в полете терпят неудачу. Ожидается, что драйверы будут автоматически перезапускать транзакции без полетов. Однако я этого не вижу. Запросы, которые я запускаю, являются базой данных, иногда я вижу, что они снова запускаются на стороне базы данных, но мы видим, что закрытие соединения закрыто на стороне клиента

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

Я ссылался на некоторые блоги, такие как это, https://martincarstenbach.wordpress.com/2013/12/13/playing-with-application-continuity-in-rac-12c/

Пример, упомянутый здесь, похоже, не предназначен для повторения операторов SQL в полете.

Является ли непрерывность приложений способными или воспроизводящими операторы SQL в полете во время сбоя или FCF и непрерывность приложения восстанавливают состояние объекта соединения и делают его пригодным для использования пользователем после того, как произошел сбой. Если раньше было правдой, то, пожалуйста, направляйте меня, если мне не хватает чего-либо в настройках уровня приложения в моем коде, что мешает мне добиться повтора.

  • 0
    это зависит от условий. Я проверил, похоже, что драйвер JDBC имеет некоторое внутреннее ограничение на объем запоминаемых изменений. Если вы превысите этот порог, вы получите java.sql.sqlRecoverableException, когда соединение разорвано. Я не смог найти и задокументировал значение для этого порога.
Теги:
transactions
oracle12c
ojdbc

2 ответа

3

Да, ваше понимание правильное. При использовании драйвера повтора приложение Continuity может воспроизводить работу в полете, чтобы отключение было невидимым для приложения, и приложение может продолжаться, отсюда и название функции. Единственное, что видно из приложения, - это небольшая задержка в вызове JDBC, который ударил по отключению. Также видно увеличение использования памяти на стороне JDBC, поскольку драйвер поддерживает очередь вызовов. Что происходит под обложками, так это то, что при отключении ваше физическое соединение JDBC будет заменено новым, а драйвер воспроизведения повторит свою очередь вызовов.

Теперь могут быть случаи, когда повтор проигрывается. Например, воспроизведение будет неудачным, если данные будут изменены. Повтор также будет отключен, если у вас есть несколько транзакций в "запросе". "Запрос" начинается, когда соединение заимствовано из пула и заканчивается, когда оно возвращается обратно в пул. Обычно "запрос" соответствует выполнению сервлета. Если в этом запросе у вас есть более одного "фиксации", то повторное воспроизведение будет отключено во время выполнения, и драйвер воспроизведения остановится в очереди. Также обратите внимание, что автоматическая фиксация должна быть отключена.

[Я являюсь частью команды Oracle, которая разработала и реализовала эту функцию]

  • 0
    Под запросом в полете вы также имеете в виду, что курсор на JDBC ResultSet восстанавливается в своем положении до сбоя. (Например, если запрос собирается вернуть 1 миллион результатов, и мы переместились, скажем, к 10000-й строке, курсор будет восстановлен в этой позиции?)
  • 0
    Спасибо за разъяснение @Джан. Я также попытался отключить автоматическую фиксацию. Однако мне не удалось добиться желаемых результатов. Кроме того, большинство документов и блогов, на которые я ссылался, не содержат конкретных примеров воспроизведения при использовании UCP. Можете ли вы указать мне такую документацию / блог / пример, который иллюстрирует воспроизведение транзакций в полете с использованием UCP?
Показать ещё 4 комментария
0

Я думаю, что строка соединения jdbc может быть вашей проблемой:

pds.setURL("jdbc:oracle:thin:@my_scan_name.my_domain_name.com:PORT_NUMBER/my_service_name");

Вы используете так называемую строку EZConnect но это не поддерживается AC.

Alias (or URL) = (DESCRIPTION=
(CONNECT_TIMEOUT= 120)(RETRY_COUNT=20) RETRY_DELAY=3)(TRANSPORT_CONNECT_TIMEOUT=3)
(ADDRESS_LIST=(LOAD_BALANCE=on)
(ADDRESS=(PROTOCOL=TCP)(HOST=primary-scan)(PORT=1521)))
(ADDRESS_LIST=(LOAD_BALANCE=on)
(ADDRESS=(PROTOCOL=TCP)(HOST=secondary-scan)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME=gold-cloud)))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню