2009-08-03 10 views
5

Używam Oracle 11g dla mojej bazy danych i jej funkcji Oracle Streams AQ jako implementacji JMS.Udostępnianie transakcji JMS i hibernacji w Spring MDB przy użyciu Oracle Streams AQ?

Z tego, co wiem, powinno być możliwe wdrożenie opartego na komunikatach POJO (MDP) opartego na komunikatach, które wykorzystuje to samo źródło danych zarówno dla transakcji, jak i transakcji JMS - bez transakcji XA (IIRC, to został wprowadzony na rynek jako funkcja SpringSource Advanced Pack for Oracle).

Czy jest to również możliwe przy użyciu Hibernate? Najlepiej byłoby, gdyby mój MDP uruchamiał transakcję JMS i odczytał komunikat z kolejki, a następnie ponownie użył transakcji dla dostępu do danych przez Hibernate. Jeśli coś pójdzie nie tak, JMS i transakcja bazy danych zostaną wycofane, bez użycia zatwierdzania 2-fazowego (2PC).

Nie jestem guru transakcji, więc zanim zacznę głębiej kopać, czy ktoś może potwierdzić, że jest to możliwe i ma sens?

Aktualizacja:
Co chcę jest wdrożenie Shared Transaction Resource pattern. sample code demonstruje to dla ActiveMQ i JDBC, ale muszę użyć Oracle Streams AQ i Hibernate.

Update2: SpringSource Advanced Pack for Oracle został open sourced w ramach wiosennego danych JDBC i „zapewnia możliwość korzystania z jednego lokalnego menedżera transakcji zarówno dla bazy danych i dostępu do wiadomości, bez uciekania się do drogi rozprowadzane 2 -faza zatwierdzenia zarządzanie transakcjami ".

Odpowiedz

3

2PC nie powinno być konieczne, jak mówisz, ponieważ opiekun powinien się nim zająć. Jednak będziesz musiał raczej używać transakcji JTA (tzn. Kontener JavaEE) niż transakcji z użyciem wanny DataSource, ponieważ JMS działa tylko z JTA.

To nie jest wielka sprawa, to po prostu nieco bardziej skomplikowanego:

  1. Twój Wiosna config powinien używać <jee:jndi-lookup/> dostać odniesienie do swojego kontenera DataSource i wstrzyknąć że źródło dane do swojego wiosennego modelu hibernacji SessionFactory.
  2. Następnie należy wprowadzić menedżera transakcji do kontekstu (<tx:jta-transaction-manager/> powinien działać w większości serwerów aplikacji).
  3. W urządzeniu Spring JMS MessageListenerContainer podłącz do niego odniesienie do powyższego menedżera transakcji.

Czy to wszystko ma sens, czy powinienem je opracować? Ta konfiguracja zapewnia, że ​​transakcje zarządzane przez kontener są utrzymywane w interakcjach JMS i Hibernuj.

+0

+1. Zastanawiam się jednak nad "wszystkimi bez Transakcji XA (IIRC, był to produkt wprowadzony na rynek jako dodatek do SpringSource Advanced Pack for Oracle)". Jestem całkiem pewny, że każda transakcja obejmująca wiele węzłów (na przykład JMS i DA) musi być transakcją XA i musi używać 2PC - podczas gdy zwykle odbywa się to za kontenerem za sceną, to jednak się robi. Czy się mylę? Czy jest jakaś nowa niesamowita technologia, która w jakiś sposób czyni to niepotrzebnym? – ChssPly76

+0

Dzięki za komentarze. Zaktualizowałem moje pytanie po tym, jak zacząłem trochę głębiej. Jak opisano w artykule, do którego linkowałem, chciałbym całkowicie uniknąć JTA i XA. Dokumenty dla [SpringSource Advanced Pack for Oracle] (https://www.springsource.com/products/enterprise/oraclepack) (pobierz [tutaj] (http://www.springsource.com/downloads/springsource-advanced-pack -for-oracle-database-download)) również wspominają o tej parzystości (patrz ostatni akapit rozdziału 3.2, który jest zbyt długi, by tu zacytować, niestety). –

+1

Nie ma sposobu, aby uzyskać koordynację tx między źródłami danych i JMS bez JTA. – skaffman

Powiązane problemy