2009-08-03 17 views
5

Estoy usando Oracle 11g para mi base de datos y su característica Oracle Streams AQ como implementación JMS.¿Compartir transacciones JMS e Hibernate en un Spring MDB utilizando Oracle Streams AQ?

Por lo que sé, debería ser posible implementar un POJO (MDP) impulsado por mensajes basado en Spring que utiliza la misma fuente de datos para acceso a datos transaccionales y transacciones JMS, todo sin XA-Transactions (IIRC, esto fue comercializado como una característica de SpringSource Advanced Pack for Oracle).

¿Esto también es posible con Hibernate? Idealmente, mi MDP iniciaría una transacción JMS y leería un mensaje de una cola, luego volvería a usar la transacción para el acceso a datos a través de Hibernate. Si algo sale mal, la transacción JMS y la base de datos se revertirán, sin utilizar la confirmación de 2 fases (2PC).

No soy un gurú de las transacciones, así que antes de comenzar a cavar más profundo, ¿alguien puede confirmar que esto es posible y también tiene sentido?

Actualización:
Lo que yo quiero es una implementación de la Shared Transaction Resource pattern. El sample code lo demuestra para ActiveMQ y JDBC, pero necesito usar Oracle Streams AQ e Hibernate.

Update2: El paquete avanzado de SpringSource para Oracle ha sido open sourced como parte de la primavera de datos JDBC y que "ofrece la opción de utilizar un único administrador de transacciones locales, tanto para la base de datos y el mensaje acceso sin recurrir a caros distribuido 2 -fase commit gestión de transacciones ".

Respuesta

3

2PC no debería ser necesario, como dices, ya que el servidor de aplicaciones debería encargarse de ello. Sin embargo, tendrá que usar transacciones JTA (es decir, contenedores JavaEE) en lugar de transacciones vanas de DataSource, ya que JMS solo funciona con JTA.

Esto no es un gran problema, es sólo un poco más incómoda:

  1. Su configuración Primavera debería utilizar <jee:jndi-lookup/> para obtener una referencia al de su contenedor DataSource, y se inyecta esa fuente de datos en su hibernate gestionado por resorte SessionFactory.
  2. Luego debe introducir un administrador de transacciones en el contexto (<tx:jta-transaction-manager/> debería funcionar en la mayoría de los servidores de aplicaciones).
  3. En su Spring JMS MessageListenerContainer, conecte la referencia anterior del administrador de transacciones.

¿Tiene todo eso sentido, o debería explicarlo? Esta configuración debe garantizar que las transacciones gestionadas por contenedor se lleven a cabo en las interacciones JMS e Hibernate.

+0

+1. Me pregunto, sin embargo, sobre "todo sin XA-Transactions (IIRC, esto se comercializó como una característica del paquete avanzado de SpringSource para Oracle)". Estoy bastante seguro de que cualquier transacción que abarque varios nodos (por ejemplo, JMS y DA) tiene que ser una transacción XA y tiene que usar 2PC, mientras que normalmente se hace por contenedor detrás de la escena, sin embargo se hace. ¿Me equivoco? ¿Hay alguna nueva tecnología sorprendente que de alguna manera lo haga innecesario? – ChssPly76

+0

Gracias por sus comentarios. Actualicé mi pregunta después de profundizar un poco más. Como se describe en el artículo al que me he vinculado, me gustaría evitar JTA y XA por completo. Los documentos de [Paquete avanzado de SpringSource para Oracle] (https://www.springsource.com/products/enterprise/oraclepack) (descargue [aquí] (http://www.springsource.com/downloads/springsource-advanced-package) -for-oracle-database-download)) también mencionan esa pasibilidad (ver el último párrafo del capítulo 3.2, que es demasiado largo para citar aquí, desafortunadamente). –

+1

No hay forma de que obtenga la coordinación de tx en orígenes de datos y JMS sin JTA. – skaffman

Cuestiones relacionadas