2012-07-29 5 views
11

utilizzando EclipseLink come JPA fornitore 2.0, posso ottenere una connessione JDBC semplicemente chiamandoOttenere una connessione JDBC da EclipseLink

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

Ma io sono sicuro di cosa sono responsabile. Devo chiudere la connessione dopo aver inviato le mie domande? Oppure non sono autorizzato a chiudere la connessione, perché anche EclipseLink utilizza questa connessione internamente. O non importa, perché EclipseLink osserva il mio comportamento e chiude automaticamente la connessione se non lo faccio?

+0

È Java EE o SE? – perissf

+0

Ambiente Java Java normale. – user1494080

+0

Perché hai bisogno di una connessione? JPA utilizza EntityManager nella maggior parte delle situazioni. – perissf

risposta

6

Se si è nel contesto di una transazione JPA, la connessione verrà gestita dal provider (EclipseLink). Se sei fuori da una transazione, sei responsabile della gestione della connessione.

consultare il seguente link per ulteriori informazioni:

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

+0

Ho un problema. La transazione impegna sempre le modifiche, anche se eseguirò un rollback sul gestore delle entità. Sto usando il driver Informix db e ifxjdbc. La transazione è gestita dall'applicazione. E il secondo problema è che eclipselink restituisce null su unwrap (java.sql.Connection). Usando eclipselink 2.5.1 con il vecchio SGES2.1.1. – dmatej

+0

Risolto: il wiki di EclipseLink era sbagliato ma il metodo unwrap è corretto.Ho corretto la wiki di Eclipselink oggi. – dmatej

1

Ma io sono sicuro di cosa sono responsabile. Devo chiudere la connessione dopo aver inviato le mie domande? Oppure non sono autorizzato a chiudere la connessione, perché anche EclipseLink utilizza questa connessione internamente.

Una domanda valida e valida. Sembra che alla documentazione manchi la semantica delle chiamate unwrap().

Per quanto riguarda EclipseLink, secondo da quello che ho ottenuto dal source:

EclipseLink ti dà una di riferimento al momento attiva connection che utilizza per la attiva client transazione attualmente sessione. Se nessuna transazione è attiva, verrà creato uno nuovo, associato alla sessione e restituito dal metodo unwrap().

Di conseguenza, IMHO, un commit/rollback di tale valore ottenuto da Connection può comportare comportamenti e/o eccezioni non definiti. Lo stesso è vero per l'esecuzione di DML che ha modificato i record precedentemente memorizzati nella cache dalle cache interne di eclipselink o per le quali esistono entità gestite.
Quindi, quando si utilizza questa API, soprattutto se la transazione sottostante è sporca, fare attenzione.

Se è possibile fare riferimento alle classi interne di eclipselink, è possibile accedere al pool di connessioni interne eclipselink per ottenere un Connection esclusivamente (consultare org.eclipse.persistence.sessions.server.ServerSession.getConnectionPool(String)).