Распространение транзакций Oracle между С++ и Java
У нас есть существующее приложение на С++, которое мы постепенно заменим новой системой на базе Java. Пока мы полностью не переопределили все в Java, мы ожидаем, что С++ и Java должны взаимодействовать друг с другом (RMI, SOAP, обмен сообщениями и т.д. - мы не решили).
Теперь мой менеджер считает, что нам понадобятся стороны Java и С++ для участия в одной транзакции Oracle DB. Это связано, но отличается от обычной проблемы с распределенной транзакцией о том, что один процесс координирует 2 транзакционных ресурса, таких как БД и очередь сообщений.
Я думаю, что распространение транзакции через процессы - ужасная идея из точки зрения производительности и стабильности, но меня все равно попросят найти решение.
Я знаком с транзакциями XA, и я проделал определенную работу с JBoss Transaction Manager, но мой googling не показал ничего хорошего в распространении транзакции XA между двумя процессами.
Мы используем Spring на стороне Java, и в их документации явно указано, что они не предоставляют никакой помощи в распространении транзакций.
Мы не планируем использовать традиционный Java EE-сервер (например, IBM Websphere), который может поддерживать распространение (не для того, чтобы найти какую-либо окончательную документацию).
Приветствуется любая помощь или указатели на решения.
Ответы
Ответ 1
Существует пример в блоге Laurent Schneider об использовании пакета DBMS_XA внутри Oracle, чтобы разрешить несколько сеансов работать в одной транзакции. Таким образом, было бы возможно, чтобы сессии Java и С++ участвовали в одной и той же транзакции без необходимости какого-либо дополнительного координатора.
В качестве альтернативы вы можете использовать Workspace Manager. Первоначально он был разработан для поддержки чрезвычайно длительных транзакций (т.е. Манипулирования множеством пространственных данных для предлагаемой разработки). По существу, вы можете создать рабочую область, которая в вашем случае будет примерно эквивалентна именованной транзакции. Оба кода Java и С++ могут войти в это рабочее пространство (из отдельных сеансов), и оба могут манипулировать и фиксировать данные в этой рабочей области. Когда транзакция завершена, вы можете объединить рабочее пространство в рабочее пространство LIVE, что эквивалентно совершению фиксации в обычной транзакции.
С другой стороны, я бы полностью согласился с вашей первоначальной оценкой того, что координация транзакций между процессами, скорее всего, будет плохой идеей с точки зрения производительности, стабильности, простоты и обслуживания. С другой стороны, вполне может быть законным бизнес-требованием в зависимости от того, как код С++ будет удален (т.е. Можно ли заменить код таким образом, что транзакции могут быть либо исключительно Java, либо исключительно С++)
Ответ 2
Я использую Hazlecast Блокировки обмена сообщениями и распределенной памятью для решения некоторых из этих проблем, однако использование такого инструмента потребует передислокации вашего программное обеспечение в тех частях, где вы касаетесь одних и тех же данных. С++ client docs здесь Java-клиент здесь
Oracle также имеет аналогичный продукт под названием Oracle Coherence, который может вам помочь, см. блокировку в руководстве для разработчиков.
Также база данных содержит систему MQ, называемую Oracle Streams Advanced queueing (постоянные очереди транзакций), которые могут помочь вам в некоторых ситуациях. Oracle AQ хорошо интегрируется с триггерами Oracle.
Кроме того, существует Уведомление об изменении базы данных, которое может помочь вам обновить кеши или сообщить о процессах обновлений, это можно использовать вместе с Оптимистический шаблон автономной блокировки.
См. также Программная транзакционная память
Apache Zookeeper также может помочь вам с распределенной блокировкой.
Ответ 3
Я считаю, что JBoss Transaction Manager поддерживает распространение 2pc tx через вызовы веб-сервисов. Вы могли бы, я полагаю, интегрировать ваши системы таким образом, но производительность будет вонять.