Распространение транзакций Oracle между C++ и Java

У нас есть существующее приложение C++, которое мы собираемся постепенно заменить новой системой на основе Java. Пока мы полностью не переопределим все на Java, мы ожидаем, что C++ и Java должны взаимодействовать друг с другом (RMI, SOAP, обмен сообщениями и т. д. — мы еще не решили).

Теперь мой менеджер считает, что нам нужно, чтобы стороны Java и C++ участвовали в одной и той же транзакции Oracle DB. Это связано с обычной проблемой распределенных транзакций, но отличается от нее, когда один процесс координирует 2 транзакционных ресурса, таких как БД и очередь сообщений.

Я думаю, что распространение транзакции между процессами — ужасная идея с точки зрения производительности и стабильности, но меня все равно спросят о решении.

Я знаком с транзакциями XA и немного поработал с диспетчером транзакций JBoss, но мой поиск в Google не дал ничего хорошего в распространении транзакции XA между двумя процессами.

Мы используем Spring на стороне Java, и в их документации прямо указано, что они не предоставляют никакой помощи в распространении транзакций.

Мы не планируем использовать традиционный сервер Java EE (например, IBM Websphere), который может иметь поддержку распространения (не то, чтобы я мог найти какую-либо окончательную документацию).

Любая помощь или указатели на решения очень ценятся.


person Steven Dick    schedule 04.09.2008    source источник
comment
Вы можете встроить свое приложение в качестве хранимой процедуры JVM? Затем вы можете просто вызвать фрагмент вашего приложения из C++ через соединение с базой данных.   -  person ibre5041    schedule 01.04.2015
comment
Теоретически можно сделать и наоборот. Создайте хранимую процедуру c, которая будет подключаться к базе данных. Тогда эта процедура будет участвовать в той же транзакции.   -  person ibre5041    schedule 01.04.2015
comment
вы также можете назвать распределенную транзакцию. то есть вы назначаете ему приготовленное имя. затем другой процесс может присоединиться к той же транзакции. Насколько мне известно, для этой цели можно использовать DBMS_XA или DBMS_TRANSACTION.   -  person ibre5041    schedule 01.04.2015
comment
Можете ли вы предоставить полный вариант использования   -  person oluies    schedule 07.04.2015


Ответы (3)


В блоге Лорана Шнайдера есть пример использования пакета DBMS_XA внутри Oracle. разрешить нескольким сеансам работать в одной и той же транзакции. Таким образом, можно было бы, чтобы сеансы Java и C++ участвовали в одной и той же транзакции без необходимости в каком-либо дополнительном координаторе.

В качестве альтернативы вы можете рассмотреть возможность использования Workspace Manager. Первоначально он был разработан для поддержки чрезвычайно длительных транзакций (т. е. манипулирования большим количеством пространственных данных для предлагаемой разработки). По сути, вы можете создать рабочее пространство, которое в вашем случае будет примерно эквивалентно именованной транзакции. Код Java и C++ мог входить в эту рабочую область (из отдельных сеансов), и оба могли манипулировать и фиксировать данные в этой рабочей области. Когда транзакция была завершена, вы можете объединить рабочую область с рабочей областью LIVE, что эквивалентно выполнению фиксации в обычной транзакции.

С другой стороны, я полностью согласен с вашей первоначальной оценкой, что координация транзакций между процессами, скорее всего, будет плохой идеей с точки зрения производительности, стабильности, простоты и обслуживания. С другой стороны, это вполне может быть законным бизнес-требованием в зависимости от того, как код C++ будет удален (т. е. возможно ли заменить код таким образом, чтобы транзакции могли быть либо исключительно Java, либо исключительно C++)

person Justin Cave    schedule 17.09.2008

Я использовал Hazlecast блокировки обмена сообщениями и распределенной памяти, чтобы решить некоторые из этих проблем, однако использование такого инструмента потребует от вас переделайте свое программное обеспечение в тех частях, где вы касаетесь одних и тех же данных. Документация по клиенту C++ здесь Клиент Java здесь

У Oracle также есть аналогичный продукт под названием Oracle Coherence, который может вам помочь, см. ">блокировка в руководстве разработчика.

Также база данных содержит систему MQ под названием Расширенная организация очередей Oracle Streams (транзакционные постоянные очереди), которые могут помочь вам в некоторых ситуациях. Oracle AQ хорошо интегрируется с триггерами Oracle.

Кроме того, существует уведомление об изменении базы данных, которое может вам помочь обновлять кэши или уведомлять процессы об обновлениях, это можно использовать вместе с схемой Optimistic Offline Lock.

См. также программная транзакционная память.

Apache Zookeeper также может помочь вам с распределенной блокировкой.

person oluies    schedule 07.04.2015
comment
Спасибо за подробный ответ, описывающий несколько подходов, которые мне нужно будет проверить. Я собираюсь присудить вам награду, потому что это единственный новый ответ на этот вопрос. Тем не менее, я все еще ищу дополнительные альтернативы, особенно легкие решения, которым не нужны, возможно, дорогие сторонние продукты (или корпоративная версия oracle). - person MRalwasser; 08.04.2015
comment
Я не думаю, что есть простой способ сделать это. В зависимости от того, что делает система и как выглядит, есть варианты, посмотрите Работа с устаревшим кодом programmers.stackexchange.com/a/122100< /а> - person oluies; 09.04.2015

Я считаю, что JBoss Transaction Manager поддерживает распространение 2pc tx через вызовы веб-службы. Я полагаю, вы могли бы интегрировать свои системы таким образом, но производительность была бы отвратительной.

person skaffman    schedule 23.09.2008