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