2008-09-04 16 views
14

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

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

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

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

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

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

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

+0

Вы можете «внедрить» ваше приложение в качестве хранимой процедуры JVM? Затем вы можете «просто» вызвать фрагмент вашего приложения из C++ через соединение с базой данных. – ibre5041

+0

Теоретически вы также можете сделать oposit. Запишите c-хранимую процедуру, которая «подключится» к базе данных. Затем эта процедура будет участвовать в той же транзакции. – ibre5041

+0

вы также можете «назвать» распределенную транзакцию. т. е. вы назначаете ему приготовленное имя. то другой процесс может «присоединиться» к той же транзакции. Для этой цели можно использовать AFAIK DBMS_XA или DBMS_TRANSACTION. – ibre5041

ответ

10

Существует an example on Laurent Schneider's blog с использованием пакета DBMS_XA внутри Oracle, чтобы разрешить несколько сеансов работать в одной транзакции. Таким образом, было бы возможно, чтобы сессии Java и C++ участвовали в одной и той же транзакции без необходимости какого-либо дополнительного координатора.

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

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

0

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

4

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

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

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

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

Смотрите также Software transactional memory

Apache Zookeeper также может помочь вам с распределенным locking.

+0

Спасибо за подробный ответ, описывающий несколько подходов, которые мне нужно будет проверить. Я собираюсь наградить вас щедростью, потому что это единственный новый ответ на этот вопрос. Тем не менее, я все еще ищу дополнительные альтернативы, особенно легкие решения, которые не нуждаются в возможно дорогих сторонних продуктах (а не в корпоративной версии oracle). – MRalwasser

+0

Я не думаю, что есть простой способ сделать это. В зависимости от того, что система делает и выглядит, есть варианты, посмотрите «Работа с устаревшим кодом» http://programmers.stackexchange.com/a/122100 – oluies