Manuelles commit einer Transaktion verwaltet
Bekam ich eine "API" in form eines Glases, um zu tun, einige externe Buchführung von meinem Java-Naht-Hibernate appplication.
Intern die API ist eine einfache Hibernate-Anwendung, die Verwendung von zwei unabhängigen Datenquellen außer das man verwendet, von der Naht selbst.
Das Problem ist, dass man die "API" - Operationen die folgende Ausnahme ausgelöst, wenn dabei eine interne .commit():
java.sql.SQLException: You cannot commit during a managed transaction!
at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.jdbcCommit(BaseWrapperManagedConnection.java:543)
at org.jboss.resource.adapter.jdbc.WrappedConnection.commit(WrappedConnection.java:334)
at org.hibernate.transaction.JDBCTransaction.commitAndResetAutoCommit(JDBCTransaction.java:139)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:115)
at com.other.APIAccountingImpl.moneyMovement(APIAccountingImpl.java:261)
at com.myapp.integration.ExternalApiIntegrator.storeAcountingData(ExternalApiIntegrator.java:125)
at com.myapp.session.EmployeeAccounting.persistData(EmployeeAccounting.java:123)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at ...
Den source-code der moneyMovement-Methode sieht der standard Hibernate-Session-Transaktion idiom:
Session sess = factory.openSession();
Transaction tx;
try {
tx = sess.beginTransaction();
//do some work
...
tx.commit();
}
catch (Exception e) {
if (tx!=null) tx.rollback();
throw e;
}
finally {
sess.close();
}
Ich bin mit Seam-managed transactions mit JTA. Ich bin auch gezwungen, verwenden Sie die benutzerdefinierte API-und ich bin nicht gestattet, den Quelltext zu ändern.
Was sind meine alternativen? Wie kann ich die isolieren, die Naht verwaltet Transaktionen, die von "API" Hibernate-Session? Es ist möglich zu konfigurieren, dass eine Verbindung von einer bestimmten Datenquelle, um sich nicht einem managed-trx?
InformationsquelleAutor vz0 | 2011-01-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie wahrscheinlich mit JTA, die eine Java-EE-standard für Transaktions-management. In diesem Fall, verwenden Sie eine verwaltete Transaktion. Es bedeutet, dass der container (JBoss, es scheint), ist die Handhabung der Transaktion Grenzen, und verwenden die JTA-Semantik, um ein rollback für die Transaktion, im Fall, dass Sie werfen einige Ausnahme. In diesem Szenario, Sie befassen sich nicht mit den Transaktions-API direkt. Sie werfen nur einige Ausnahme, falls etwas schief geschieht, und es kümmere Rollen wieder die anderen Teile der Transaktion.
Sagte, ich würde empfehlen Sie, um zu bestätigen, dass ein GLAS, das Sie erhalten, ist die JTA api. Wenn nicht, dann werden Sie sicherlich brauchen die Dokumentation für Sie. Wenn es ist, können Sie mit der Transaktion API (und Anmerkungen) die explizite Abgrenzung von Transaktionen. (eine Dokumentation ist hier verfügbar: http://download.oracle.com/javaee/5/tutorial/doc/bnciy.html#bnciz)
Insgesamt würde ich sagen, dass es normalerweise eine gute Idee, lassen Sie die container verwalten Sie Ihre Transaktionen eine Transaktion ist in der Regel im Rahmen eines business-Methode, die kann bedeuten, zwei oder mehr DAO nennt, also jenseits der Transaktionen, die Sie würde in jedem DAO-Methode.
InformationsquelleAutor jpkrohling
Wenn Sie möchten, die 2 Geschäfte verknüpft werden, könnte es möglich sein, den dreck mit der hibernate-config, so dass die Transaktion Instanz ist eine, die Sie Steuern. Sie könnten daher geben die zugrunde liegenden hibernate-code ein dummy-Transaktion, die nichts und lassen Sie die Naht Steuerung der echten Transaktion.
Alternativ, wenn Sie nicht wollen, dass die 2 Transaktionen verknüpft sind, könnten Sie wahrscheinlich rufen Sie die API aus ejb-Methode mit transaction-Attribut "nicht unterstützt" (nicht super klar auf, wie die Naht funktioniert, aber vorausgesetzt, es ist ejb unter der Haube). dies würde die Trennung der API-Transaktion aus der aktuellen Naht Transaktion.
InformationsquelleAutor jtahlborn