2012-07-29 3 views
11

Eclipse als JPA 2.0 Anbieter verwendet, kann ich einfach durch Aufrufeine JDBC-Verbindung von Eclipse Ersten

Connection con = entityManager.unwrap(Connection.class); 

eine JDBC-Verbindung erhalten, aber ich bin nicht sicher, was ich bin verantwortlich. Muss ich die Verbindung nach dem Absenden meiner Anfragen schließen? Oder darf ich die Verbindung nicht schließen, weil EclipseLink diese Verbindung auch intern verwendet. Oder ist es egal, weil EclipseLink mein Verhalten beobachtet und die Verbindung automatisch schließt, wenn ich es nicht mache?

+0

Ist das Java EE oder SE? – perissf

+0

Klare Java SE-Umgebung. – user1494080

+0

Warum brauchen Sie eine Verbindung? JPA verwendet EntityManager in den meisten Situationen. – perissf

Antwort

6

Wenn Sie sich im Kontext einer JPA-Transaktion befinden, wird die Verbindung vom Provider (EclipseLink) verwaltet. Wenn Sie sich außerhalb einer Transaktion befinden, sind Sie selbst dafür verantwortlich, die Verbindung zu verwalten.

Siehe den folgenden Link für weitere Informationen:

http://wiki.eclipse.org/EclipseLink/Examples/JPA/EMAPI#Getting_a_JDBC_Connection_from_an_EntityManager

+0

Ich habe ein Problem. Die Transaktion bestätigt immer Änderungen, selbst wenn ich einen Rollback für den Entity Manager mache. Ich benutze Informix db und ifxjdbc Treiber. Transaktion ist anwendungsgesteuert. Und das zweite Problem ist, dass Eclipselink null auf unwrap (java.sql.Connection) zurückgibt. Verwenden von eclipselink 2.5.1 mit alten SGES2.1.1. – dmatej

+0

Gelöst: Das EclipseLink Wiki war falsch, aber es ist unwrap Methode korrekt.Ich habe Eclipselinks Wiki heute repariert. – dmatej

1

Aber ich bin nicht sicher, was ich bin verantwortlich. Muss ich die Verbindung nach dem Absenden meiner Anfragen schließen? Oder darf ich die Verbindung nicht schließen, weil EclipseLink intern auch diese Verbindung verwendet.

Eine gute und gültige Frage. Es scheint, dass die Dokumentation die Semantik der unwrap() Aufrufe fehlt.

In Bezug auf Eclipse, nach dem, was ich aus den source bekam:

Eclipselink gibt Ihnen eine Referenz auf die derzeit aktiven connection, die es für die aktuell aktiven Client-Sitzungstransaktion verwendet. Wenn keine Transaktion aktiv ist, wird neu erstellt,, der Sitzung zugeordnet und von der unwrap()-Methode zurückgegeben.

Als Ergebnis kann IMHO, ein Festschreiben/Rollback eines solchen erhalten Connection zu undefiniertem Verhalten und/oder Ausnahmen führen. Gleiches gilt für die Ausführung von DML, bei der geänderte Datensätze zuvor von internen ECCELSELINK-Caches zwischengespeichert wurden oder für die verwaltete Elemente existieren.
Also, wenn Sie diese API, vor allem wenn die zugrunde liegende Transaktion ist schmutzig, vorsichtig sein.

Wenn Sie auf interne Eclipselink-Klassen verweisen können, können Sie auf den internen Verbindungspool von eclipselink zugreifen, um exklusiv eine Connection zu erhalten (siehe org.eclipse.persistence.sessions.server.ServerSession.getConnectionPool(String)).

Verwandte Themen