2016-10-25 8 views
0

Ich schreibe eine JEE7-Anwendung, die in WebSphere Liberty Profile 8.5.5 ausgeführt wird. Wir verwenden JPA (das über Eclipselink in WLP implementiert wird).So erhalten Sie EntityManager für mehrere Persistenzeinheiten

Ich habe mehrere Persistenz-Einheiten in der gleichen 'persistence.xml' Datei. Ich muss auch auf zwei dieser Einheiten in derselben Klasse zugreifen.

Ich erhalte einen Laufzeitfehler, wenn ich versuche, den zweiten EntityManager zu verwenden:

@PersistenceContext(unitName = "wwer-list") 
private EntityManager entityManagerWwerList; 
@PersistenceContext(unitName = "main-dashboard") 
private EntityManager entityManagerMainDashboard; 

E WTRN0062E: An illegal attempt to use multiple resources that have only one-phase capability has occurred within a global transaction. 

Wie kann ich diesen Fehler beheben?

Alle Tabellen, die ich verwende, werden nur zum Lesen benötigt. Wie kann ich angeben, dass ich nur Lesezugriff auf JPA möchte?

+0

Ich habe dies von der Fehlermeldung erhalten. http://www-01.ibm.com/support/docview.wss?uid=swg21247192. Was ich verstehe, ist, dass Sie verteilte Transaktionen benötigen, um über zwei persistente Einheiten zu arbeiten. Sie müssen möglicherweise etwas wie Bitronix Transaktionsmanager verwenden, um das zu erreichen – kjsebastian

+0

Wie sieht Ihre persistence.xml aus? –

+0

\t jdbc/WWER-Liste com.ibm.youribm.services.expensesaggregator.ejb.dao .jpa.Einheit.WwerEntity \t \t jdbc/main-Armaturenbrett \t \t com.ibm.youribm.services.expensesaggregator.ejb.dao.jpa.entity.DashboardEntity ... – Westy

Antwort

0

Dieses Problem wird angezeigt, weil eine Ihrer Datenquellen, die mit ConnectionPoolDataSource konfiguriert wurde (als einphasiges Commit), mit XADataSource konfiguriert wird.

Wenn Sie mit der gleichen Datenquellenkonfiguration fortfahren möchten, müssen Sie Ihre Serverkonfiguration auf "Accept Heuristic Hazard" aktualisieren.

Klicken Sie in der Admin-Konsole auf das OHR, aktivieren Sie das Kontrollkästchen "Heuristische Gefahr akzeptieren". Starten Sie den Server neu.

Dieser Link, um den Last Participant Support zu aktivieren, kann ebenfalls hilfreich sein. http://www.ibm.com/support/knowledgecenter/SSAW57_7.0.0/com.ibm.websphere.nd.doc/info/ae/webui_pme/ui/ueac_laoextensionsettings.html

+0

Danke. Aber ich habe XADataSource nicht absichtlich konfiguriert, ich habe das nirgendwo eingestellt. Ich muss nur die Datenquellen lesen, es wird keine Aktualisierung geben. – Westy

0

ich sicher ohne Ihre persistence.xml und server.xml Konfigurationen kann nicht sagen, aber es sieht aus wie die <dataSource> Elemente Ihre <persistence-unit> Konfigurationen Sicherung der Lage sind, nicht XA.

Standardmäßig sollte ein <dataSource> sein ein javax.sql.XADataSource (und damit XA-fähig), aber wenn Sie einen JDBC-Treiber verwenden, die keine XADataSource Implementierung liefert, Freiheit wird eine einfachere Datasource-Implementierung (dh javax.sql.ConnectionPoolDataSource oder schlicht javax.sql.DataSource) wählen .

Eine globale Transaktion ist, wenn Sie eine UserTransaction.begin() ausstellen und dauert, bis Sie eine commit() oder rollback() ausgeben. Es gibt andere Möglichkeiten, wie Sie auch in eine globale Transaktion einsteigen können.

Da Sie nur Lesezugriff wünschen, wäre die Konvertierung Ihrer DataSources in XA wahrscheinlich zu viel Aufwand. Versuchen Sie stattdessen, die globalen Transaktionen aus der Gleichung zu entfernen. Wenn Sie die globalen Transaktionen nicht eliminieren können, können Sie XADataSource in Ihrer server.xml wie folgt angeben:

+0

Ich verwende keine globalen Transaktionen oder zumindest nicht absichtlich. Dies ist ein reiner schreibgeschützter Dienst. Wie kann ich globale Transaktionen loswerden? XA klingt wie Overkill, und es scheint mir, als würde es die Dinge auch verlangsamen. – Westy

Verwandte Themen