Datenverlust mit JBoss 4.2, EJB3, BMT und Hibernate

sepan

Grünschnabel
Hallo,

ich habe ein seltsames Problem. Ich verwende für eine Anwendung Bean Managed Transactions. Nach einem UserTransaction.commit() werden die Daten aber nicht (bzw. nicht immer) in die Datenbank geschrieben. Die Datenquelle ist eine local-tx-datasource (nicht XA) für Oracle9i mit TRANSACTION_READ_COMMITTED. Als PersistenceUnit ist Hibernate mit JTA konfiguriert.

Die Anwendung verarbeitet XML-Nachrichten in vielen kleinen Schritten und wurde ursprünglich mit Hibernate entwickelt. Nun wurde die Anwendung nach EJB3 portiert.
In der ursprünglichen Client-Anwendung wurde eine Session mit sessionFactory.openSession() geholt und nach dem letzten Bearbeitungsschritt mit session.close() wieder geschlossen. Die gleiche Session wird durch alle Bearbeitungsschritte durchgereicht. Jeder Schritt führt alle Datenbankzugriffe in einer neuen Transaktion mit session.beginTransaction() und transaction.commit() durch.

In der EJB3-Version wird die Session vom injizierten EntityManager geholt, mit UserTransaction.begin() eine Bean Managed Transaction gestartet und der alte Hibernate-Code aufgerufen (dieser erzeugt zwar neue Transactionen aus der Session, doch sollten diese - wenn ich richtig liege - vom JTA verwaltet werden).

Um die ganze Verarbeitungskette wurde also eine Bean mit BMT-Annotation (@TransactionManagement(TransactionManagementType.BEAN) und @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW bei der Aufruf-Methode angelegt.
EntityManager und UserTransaction werden über Annotations injected.
Vor Aufruf der Verarbeitungskette wird ein UserTransaction.begin() und danach ein UserTransaction.commit() durchgeführt.

Und doch...... der DB-Admin hat bestätigt, dass die DB-Statements verschickt werden, aber kein COMMIT.....
Doch das passiert nur manchmal, was mich zur Verzweiflung bringt.....

Auch wird laut server.log angeblich jedes mal die JDBC-Connection freigegeben und es steht auch ein "JTATransaction.commit()", doch das stimmt nicht. Es passiert alles in einer Oracle-Verbindungssession und die Transaktion wird nicht committed.

Hat wer eine Idee was da faul sein könnte?


Code:
@TransactionManagement(TransactionManagementType.BEAN)
public class WorkerServiceBean implements WorkerServiceLocal, WorkerServiceRemote {
  @PersistenceContext private EntityManager em;
  @Resource UserTransaction ut;

  @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void executeWorkflow {
        try {
            ut.begin();
            Session session = (Session)em.getDelegate();
            
            // Start Hibernate legacy-Code (hier zur Veranschaulichung hineingepasted.

            // Jeder Bearbeitungsschritt hat so einen Block:
            Transaction tx = sessio.beginTransaction();
            try {
                // arbeiten mit der Datenbank: session.load, session.save, session.update....
                // ....
               
               session.flush();   // Sicherheitshalber
               tx.commit();
             } catch (HibernateException ex) {
                 log.error("....");
                 tx.rollback();
                 throw ex;
             }
             // Ende Bearbeitungsschritt, dann kommt der nächste Bearbeitungschritt (mit neuer Transaktion etc)

            // Ende Hibernate Legacy Code  

            ut.commit();
        } catch (Exception ex) {
            ex.printStackTrace();
            try {
                ut.rollback();
            } catch (IllegalStateException e1) {
                e1.printStackTrace();
            } catch (SecurityException e1) {
                e1.printStackTrace();
            } catch (SystemException e1) {
                e1.printStackTrace();
            }
        }
   }
}

die persistence.xml:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
   version="1.0">
   <persistence-unit name="workerPU" transaction-type="JTA">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>java:/OracleDS</jta-data-source>
      <jar-file>
           <!-- jar mit *.hbm.xml und *.class für Hibernate Mappings -->
          ../lib/hibernate-mappings.jar
      </jar-file>
      <properties>
         <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9Dialect"/>
      </properties>
   </persistence-unit>
</persistence>

und die Datasource:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>OracleDS</jndi-name>
    <connection-url>jdbc:oracle:thin:@oradev:1521:tasc</connection-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <user-name>xxuser</user-name>
    <password>xxpass</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
    <max-pool-size>20</max-pool-size>
    <idle-timeout-minutes>5</idle-timeout-minutes>
      <metadata>
         <type-mapping>Oracle9i</type-mapping>
      </metadata>
  </local-tx-datasource>
</datasources>
 

Neue Beiträge

Zurück