2012-07-29 8 views
11

korzystając EclipseLink jako dostawcę JPA 2.0, mogę uzyskać połączenia JDBC po prostu dzwoniącUzyskanie połączenia JDBC z EclipseLink

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

Ale jestem pewien, co jestem odpowiedzialny. Czy po przesłaniu zapytania muszę zamknąć połączenie? Czy też nie mogę zamknąć połączenia, ponieważ EclipseLink również używa tego połączenia wewnętrznie. Czy to nie obchodzi, ponieważ EclipseLink obserwuje moje zachowanie i automatycznie zamyka połączenie, jeśli tego nie zrobię?

+0

Czy to jest Java EE lub SE? – perissf

+0

Plain Java SE environment. – user1494080

+0

Dlaczego potrzebujesz połączenia? JPA używa EntityManager w większości sytuacji. – perissf

Odpowiedz

6

Jeśli jesteś w kontekście transakcji JPA, połączenie będzie zarządzane przez dostawcę (EclipseLink). Jeśli jesteś poza transakcją, sam jesteś odpowiedzialny za zarządzanie połączeniem.

Patrz na poniższy link w celu uzyskania dodatkowych informacji:

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

+0

Mam problem. Transakcja zawsze zatwierdza zmiany, nawet jeśli wykonam przywrócenie w menedżerze podmiotu. Używam sterownika Informix db i ifxjdbc. Transakcja to aplikacja zarządzana. Drugim problemem jest to, że eclipselink zwraca wartość NULL przy rozwijaniu (java.sql.Connection). Używanie eclipselink 2.5.1 ze starym SGES2.1.1. – dmatej

+0

Rozwiązane: wiki EclipseLink było nieprawidłowe, ale metoda rozwijania jest poprawna.Dzisiaj naprawiłem wiki Eclipselinka. – dmatej

1

Ale jestem pewien, co jestem odpowiedzialny. Czy po przesłaniu zapytania muszę zamknąć połączenie ? Czy też nie wolno mi zamknąć połączenia, ponieważ EclipseLink używa tego połączenia wewnętrznie, .

Dobre i poprawne pytanie. Wydaje się, że w dokumentacji brakuje semantyki wywołań unwrap().

chodzi EclipseLink, w zależności od tego, co mam z source:

EclipseLink daje odniesienie do aktualnie aktywnej connection którego używa do aktualnie aktywnego klienta transakcji sesyjnej. Jeśli żadna transakcja nie jest aktywna, zostanie utworzony nowy nowy, powiązany z sesją i zwrócony z metody unwrap().

W rezultacie, IMHO, zatwierdzenie/wycofanie tak uzyskanego Connection może prowadzić do niezdefiniowanych zachowań i/lub wyjątków. To samo dotyczy wykonywania DML, którego zmienione zapisy były wcześniej buforowane przez wewnętrzne pamięci podręczne eclipselink lub dla których istnieją zarządzane podmioty.
Podczas korzystania z tego interfejsu API, szczególnie w przypadku zabrudzenia transakcji bazowej, należy zachować ostrożność pod numerem
.

Jeśli możesz odwołać się do klas wewnętrznych eclipselink, możesz uzyskać dostęp do wewnętrznej puli połączeń eclipselink, aby uzyskać wyłącznie Connection (spójrz na org.eclipse.persistence.sessions.server.ServerSession.getConnectionPool(String)).