Совместное использование транзакций JMS и Hibernate в Spring MDB с использованием Oracle Streams AQ? - PullRequest
5 голосов
/ 03 августа 2009

Я использую Oracle 11g для своей базы данных и функцию Oracle Streams AQ в качестве реализации JMS.

Насколько я знаю, должна быть возможность реализовать основанный на Spring POJO (MDP), основанный на сообщениях, который использует один и тот же источник данных как для доступа к транзакционным данным, так и для транзакций JMS - все без XA-транзакций (IIRC, это было продается как особенность SpringSource Advanced Pack для Oracle).

Возможно ли это и с помощью Hibernate? В идеале мой MDP должен запустить транзакцию JMS и прочитать сообщение из очереди, а затем повторно использовать транзакцию для доступа к данным через Hibernate. Если что-то пойдет не так, обе транзакции JMS и базы данных будут отменены без использования двухфазной фиксации (2PC).

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

Обновление:
Мне нужна реализация шаблона ресурса общих транзакций . Пример кода демонстрирует его для ActiveMQ и JDBC, но мне нужно использовать Oracle Streams AQ и Hibernate.

Update2: SpringSource Advanced Pack для Oracle был с открытым исходным кодом как часть Spring Data JDBC, и он "предоставляет возможность использования одного локального менеджера транзакций для обоих доступ к базе данных и сообщениям без использования дорогостоящей распределенной двухфазной фиксации Управление транзакциями ".

1 Ответ

3 голосов
/ 04 августа 2009

2PC, как вы говорите, не должны быть необходимыми, поскольку сервер приложений должен позаботиться об этом. Однако вам, скорее всего, придется использовать транзакции JTA (т.е. контейнера JavaEE), а не ванильные транзакции DataSource, поскольку JMS работает только с JTA.

Это не имеет большого значения, это просто немного сложнее:

  1. Ваша конфигурация Spring должна использовать <jee:jndi-lookup/> чтобы получить ссылка на ваш контейнер DataSource, и вы вводите это источник данных в ваш пружинный Hibernate SessionFactory.
  2. Затем вам необходимо ввести менеджер контекста в контекст (<tx:jta-transaction-manager/> должен работать на большинстве серверов приложений).
  3. В Spring JMS MessageListenerContainer вставьте в него указанную выше ссылку на менеджер транзакций.

Имеет ли это все смысл, или я должен уточнить? Эта настройка должна обеспечивать удержание транзакций, управляемых контейнером, во взаимодействиях JMS и Hibernate.

...