Obtener una conexión JDBC de EclipseLink

using EclipseLink as JPA 2.0 provider, I can obtain a JDBC connection by simply calling

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

But I'm unsure what I'm responsible for. Do I have to close the connection after submitting my queries? Or are I'm not allowed to close the connection, because EclipseLink also uses this connection internally. Or does it not care, because EclipseLink observes my behaviour and closes the connection automatically if I don't do it?

preguntado el 29 de julio de 12 a las 17:07

Why do you need a connection? JPA uses EntityManager in most of the situations. -

To call stored procedures. Calling them via EclipseLink is not supported by my DBMS. -

What DBMS are you on that EclipseLink cannot handle the stored procedures for you? -

2 Respuestas

If you are in the context of a JPA transaction the connection will be managed by the provider (EclipseLink). If you are outside of a transaction you are responsible for managing the connection yourself.

See the following link for additional information:

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

Respondido 30 Jul 12, 15:07

I have a problem. Transaction always commits changes, even if I will do a rollback on the entity manager. I'm using Informix db and ifxjdbc driver. Transaction is application managed. And second problem is that eclipselink returns null on unwrap(java.sql.Connection). Using eclipselink 2.5.1 with old SGES2.1.1. - dmatej

Resolved: The EclipseLink wiki was wrong but it's unwrap method is correct. I have fixed Eclipselink's wiki today. - dmatej

Not sure if this is relevant, but as of Jul2019, using eclipselink 2.5.0 and querydsl 4.2.1, the proposed unwrap(Connection.class) approach returns null in my own project. Solved it by creating the needed JPASQLQuery and passing the existing entityManager as parameter (see querydsl.com/static/querydsl/4.2.1/apidocs/com/querydsl/jpa/sql/…) - repoker

But I'm unsure what I'm responsible for. Do I have to close the connection after submitting my queries? Or are I'm not allowed to close the connection, because EclipseLink also uses this connection internally.

A good and valid question. It seems that the documentation is lacking the semantics of the unwrap() llamadas.

Regarding EclipseLink, according from what I got from the fuente:

EclipseLink gives you a referencia to the currently active connection which it uses for the currently active client session transaction. If no transaction is active, a new will be created, associated with the session and returned from the unwrap() método.

As a result, IMHO, a commit/rollback of such a obtained Connection may lead to undefined behavior and/or exceptions. Same is true for executing DML which changed records have been previously cached by eclipselink internal caches or for which managed entities exist.
So when using this API, especially if the underlying transaction is dirty, ten cuidado.

If you can refer to internal eclipselink classes, you can access eclipselink internal connection pool to get a Connection exclusively (have a look at org.eclipse.persistence.sessions.server.ServerSession.getConnectionPool(String) ).

Respondido 13 Oct 14, 16:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.