Pregunta

Tengo fuente de datos local (Oracle 9i) de recursos desplegados en JBoss 5.1.0:

<datasources>
  <local-tx-datasource>
    <jndi-name>OracleDS</jndi-name>
    <connection-url>jdbc:oracle:thin:@IP_ADDRESS:1521:inv9i</connection-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <user-name>***</user-name>
    <password>***</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
    <metadata>
        <type-mapping>Oracle9i</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>

unidad de persistencia:

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="myEJB" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <non-jta-data-source>java:OracleDS</non-jta-data-source>
        <class>hr.bel.model.Instrument</class>
        <class>hr.bel.model.Order</class>
        <class>hr.bel.model.OrderAdditionalData</class>
        <class>hr.bel.model.OrderCondition</class>
        <class>hr.bel.model.Trade</class>
        <class>hr.bel.model.TradeAdditionalData</class>
        <class>hr.bel.model.Tradeticker</class>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="none" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

Dentro de un MDB, cuando se invoca el método onMessage estoy tratando de conservar un conjunto de frijol a buscar últimos 5 granos de ese tipo a través de un namedQuery:

@PersistenceContext
    EntityManager em = null;
    public void onMessage(MyMessage msg) {
        Map message = msg.getMessageTree(false);
        Instrument instrument = em.find(Instrument.class, 55);      

        Tradeticker tt = createTradeticker(message);
        tt.setInstrument(instrument);

        log.info("Persisting tradeticker: " + tt.getTradeType());               
        em.persist(tt);             
        log.info("Tradeticker persisted...");

        List<Tradeticker> last5 = em.createNamedQuery("getLast5").setParameter(1,instrument.getInstrumentId()).setMaxResults(5).getResultList();
        log.info("Persisted tradetickers size: " + last5.size());
    }

Mi problema es que no hay es cualquier rastro de un error, pero todavía no hay alguna persistió objetos en mi base de datos Oracle. Después de un gran número de mensajes de llamada devuelve 0. last5.size() Log es perfectamente limpio.

Sólo restricciones para los bancos multilaterales de desarrollo que son encontrados Tengo que usar requerido o NOT_SUPPORTED atributo de transacción en los métodos. Mi onMessage no se anota lo que usos requeridos por defecto. También tengo no hay ninguna anotación en la clase MDB por lo frijol debe usar recipiente transacción gestionada.

Lo que estoy haciendo mal?

¿Fue útil?

Solución

¿No debería manejar la transacción a sí mismo cuando se trabaja con una fuente de datos no JTA? Es decir, conseguir una transacción y comprometer los datos usted mismo? Dejo ese tipo de cosas a JTA mí mismo, pero cuando leí este correctamente lo que parece al igual que en el caso de tener que comprometerse explícitamente.

Otros consejos

OK. Así es como he resuelto un problema, primero definir tx fuente de datos, definir segundo modelo de JTA y JTA-fuente de datos en persistence.xml.

Nueva definición de origen de datos:

<datasources>
  <xa-datasource>
    <jndi-name>OracleDS</jndi-name>
    <isSameRM-override-value>false</isSameRM-override-value>
    <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
    <xa-datasource-property name="URL">jdbc:oracle:thin:@IP_ADDRESS:1521:inv9i</xa-datasource-property>
    <xa-datasource-property name="User">***</xa-datasource-property>
    <xa-datasource-property name="Password">***</xa-datasource-property>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
    <no-tx-separate-pools/>
    <metadata>
      <type-mapping>Oracle9i</type-mapping>
    </metadata>
  </xa-datasource>

    JBoss: servicio = TransactionManager   

nueva persistence.xml:

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="myEJB" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:OracleDS</jta-data-source>
        <class>hr.bel.model.Instrument</class>
        <class>hr.bel.model.Order</class>
        <class>hr.bel.model.OrderAdditionalData</class>
        <class>hr.bel.model.OrderCondition</class>
        <class>hr.bel.model.Trade</class>
        <class>hr.bel.model.TradeAdditionalData</class>
        <class>hr.bel.model.Tradeticker</class>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="none" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

Mi código de Java es el mismo y ahora recibo mi objeto persistió! Después de la discusión con mis colegas que utilizan DBMS MySQL calculamos que Oracle con su TX y fuentes de datos no-TX hizo restricciones estrictas sobre cómo y dónde se utilizarán fuentes de datos. Gracias a todos!

Al pasar: un patrón común es poner la lógica de negocio en un SLSB y llamada que desde su MDB - permita otros usos de la lógica. Debe hacer ninguna diferencia a su problema sin embargo.

Yo esperaría que el atributo de transacción por defecto para ser requried. No veo una razón por qué esto debería fallar.

Me haría estas cosas:

1). Poner un try / catch alrededor de la lógica de negocio. Se lanzan excepciones?

2). Retire la consulta, no veo por qué debería estar fallando, pero permite eliminar cualquier posibilidad taht que podría estar interfiriendo con la inserción. Vamos basan en la base de datos. Utilice una instrucción de línea de comandos SQL u otra utilidad para ver qué hay en el PP después de algunos mensajes han pasado.

3). Compruebe los registros de nuevo, es un error que aparece en cualquier lugar?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top