Frage

Ich habe eine lokale Ressourcendatenquelle (Oracle9i), die bei JBoss 5.1.0 bereitgestellt wird:

<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>

Persistenzeinheit:

<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>

In einem MDB versuche ich, wenn die OnMessage -Methode aufgerufen wird, eine Bohne zu bestehen und die neuesten 5 Bohnen dieses Typs über einen NamensQuery zu holen:

@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());
    }

Mein Problem ist, dass es keinen Fehler gibt, aber es gibt immer noch keine anhaltenden Objekte in meiner Oracle -Datenbank. Nach einer großen Anzahl von Nachrichten rufen Sie an last5.size() Rückgabe 0. Das Protokoll ist perfekt sauber.

Nur Einschränkungen für MDBs, die ich gefunden habe, sind, dass ich das erforderliche oder nicht -unterstützte Transaktionsattribut für Methoden verwenden muss. Mein OnMessage ist nicht kommentiert, sodass es als Standard erforderlich ist. Außerdem habe ich keine Anmerkungen zur MDB -Klasse, sodass Bean Container -Managed Transaction verwenden sollte.

Was mache ich falsch?

War es hilfreich?

Lösung

Sollten Sie die Transaktion nicht selbst verwalten, wenn Sie mit einer Nicht-JTA-Datenquelle arbeiten? Das heißt, eine Transaktion abrufen und die Daten selbst verpflichten? Ich überlasse diese Art von Sachen JTA selbst, aber als ich lese Dies Richtig, es sieht so aus, als ob Sie in Ihrem Fall explizit festlegen müssen.

Andere Tipps

OK. So habe ich Problem gelöst, TX DataSource definieren, das JTA-Modell und JTA-Datenource in Persistenz definieren.xml.

Neue DataSource -Definition:

<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: Service = TransactionManager

Neue Persistenz.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>

Mein Java -Code ist dasselbe und jetzt lasse ich mein Objekt bestehen! Nach der Diskussion mit meinen Kollegen, die MySQL-DBMs verwenden, stellen wir fest, dass Oracle mit seinen TX- und No-TX-DataSourcen strikte Einschränkungen dafür gemacht hat, wie und wo Datenquellen verwendet werden. Danke euch allen!

Beim Passieren: Ein gemeinsames Muster besteht darin, die Geschäftslogik in einen SLSB zu stecken und diese von Ihrem MDB aufzurufen - ermöglicht eine andere Verwendung der Logik. Sollte jedoch keinen Unterschied zu Ihrem Problem machen.

Ich würde erwarten, dass das Standardtransaktionsattribut erneut geprägt wird. Ich sehe keinen Grund, warum dies scheitern sollte.

Ich würde folgende Dinge tun:

1). Probieren Sie/fangen Sie die Geschäftslogik aus. Werden Ausnahmen geworfen?

2). Entfernen Sie die Abfrage, ich kann nicht sehen, warum sie fehlschlagen sollte, aber lassen Sie uns jede Möglichkeit entfernen, dass es sich um die Einfügung stört. Lassen Sie uns auf die Datenbank verlassen. Verwenden Sie eine Befehlszeile-SQL-Anweisung oder ein anderes Dienstprogramm, um zu sehen, was sich nach einigen Nachrichten im DB befindet.

3). Überprüfen Sie die Protokolle erneut. Ist ein Fehler irgendwo angezeigt?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top