Непрерывность приложений с помощью универсального пула соединений Java JDBC Oracle 12c - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь обеспечить непрерывность приложений с помощью базы данных 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 и непрерывность приложения только восстанавливают состояние объекта соединения и делают его доступным для пользователя после возникновения сбоя. Если ранее верно, то, пожалуйста, сообщите мне, если я что-то упустил в настройках уровня приложения в моем коде, что мешает мне выполнить воспроизведение.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Я думаю, что проблема может быть в строке соединения 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)))
0 голосов
/ 11 сентября 2018

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

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

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

...