2012-07-29 16 views
11

usando EclipseLink como proveedor de JPA 2.0, puedo obtener una conexión JDBC, simplemente llamando aObtención de una conexión JDBC de EclipseLink

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

Pero estoy seguro de lo que yo soy responsable de. ¿Tengo que cerrar la conexión después de enviar mis consultas? O no puedo cerrar la conexión porque EclipseLink también usa esta conexión internamente. ¿O no le importa, porque EclipseLink observa mi comportamiento y cierra la conexión automáticamente si no lo hago?

+0

¿Es este Java EE o SE? – perissf

+0

Entorno Java SE sin formato. – user1494080

+0

¿Por qué necesitas una conexión? JPA usa EntityManager en la mayoría de las situaciones. – perissf

Respuesta

6

Si se encuentra en el contexto de una transacción JPA, la conexión será gestionada por el proveedor (EclipseLink). Si se encuentra fuera de una transacción, usted es responsable de administrar la conexión usted mismo.

Véase el siguiente enlace para obtener información adicional:

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

+0

Tengo un problema. La transacción siempre confirma los cambios, incluso si realizo una reversión en el administrador de la entidad. Estoy usando Informix db y el controlador ifxjdbc. La transacción es administrada por la aplicación. Y el segundo problema es que eclipselink devuelve null en unwrap (java.sql.Connection). Usando eclipselink 2.5.1 con el viejo SGES2.1.1. – dmatej

+0

Resuelto: El wiki de EclipseLink estaba mal pero su método de desenvolver es correcto.He solucionado el wiki de Eclipselink hoy. – dmatej

1

Pero estoy seguro de lo que yo soy responsable de. ¿Tengo que cerrar la conexión después de enviar mis consultas? O no estoy autorizado a cerrar la conexión, porque EclipseLink también usa esta conexión internamente.

Una buena y válida pregunta. Parece que la documentación carece de la semántica de las llamadas unwrap().

En cuanto EclipseLink, de acuerdo a lo que obtuve de la source:

EclipseLink le da una referencia a la actualmente activa connection que se utiliza para la sesión de transacción actualmente activa cliente. Si no hay ninguna transacción activa, se creará un nuevo, asociado con la sesión y devuelto desde el método unwrap().

Como resultado, en mi humilde opinión, una confirmación/restitución de tal obtenido Connection puede dar lugar a un comportamiento indefinido y/o excepciones. Lo mismo es cierto para ejecutar DML, que los registros modificados han sido almacenados previamente en memoria caché interna de eclipselink o para los que existen entidades administradas.
Por lo tanto, al usar esta API, especialmente si la transacción subyacente está sucia, tenga cuidado.

Si puede consultar las clases internas de eclipselink, puede acceder al grupo de conexiones internas de eclipselink para obtener un Connection exclusivamente (eche un vistazo a org.eclipse.persistence.sessions.server.ServerSession.getConnectionPool(String)).

Cuestiones relacionadas