2013-09-30 13 views
5

Używam hibernacji 4.2.4 z JPA i ładowaniem layz w stowarzyszeniu ManyToMany. Obiekt A jest powiązany z @ManyToMany(targetEntity=B.class, fetch=FetchType.LAZY) i odwrotnie. Aby pobrać dane z bazy danych nazywam następujący (uproszczony) Kod:Obsługa sesji hibernacji z leniwym ładowaniem

try { 
    session = cutSessionFactory.openSession(); 
    session.beginTransaction(); 
    List<IBO> result = session.createQuery(query).list(); 
    session.getTransaction().commit(); 
    return result; 
catch{...} 
finally{ 
    session.close; 
} 

Pierwotnie Kiedyś niech otwarte połączenie, bo jeśli mój wniosek musi zrobić jakiś leniwy załadunku sesja jest nadal potrzebne po pierwszej rozmowy. Ale kiedy to spowodowało, że moja aplikacja zamarzła po pewnych działaniach, zaryzykowałem poprzednią strategię. Teraz wszystko działa; bez zamrażania, bez problemu z leniwym ładowaniem. Ale jeśli załadować podmiot, który ma jakieś dzieci (które requieres leniwy załadunku) dziennik pisze:

WARN - AbstractPersistentCollection: Unable to close temporary session used to load lazy collection associated to no session

następnie

2013-09-25 09:35:30 - INFO - BasicResourcePool: A checked-out resource is overdue, and will be destroyed: [email protected] 
2013-09-25 09:35:30 - INFO - BasicResourcePool: Logging the stack trace by which the overdue resource was checked-out 

To ma sens, że hibernacji nie jest zamknięciem sesji (faktycznie myślałem, że jest nowa prośba o leniwy ładowanie, które używa nowej sesji), a pula połączeń rozpoznaje nieużywaną sesję. Ale w końcu hibernacja naprawia moją "złą obsługę sesji".

Czy ktoś zna lepszy sposób obsługi sesji z leniwym ładowaniem?

+0

nie u znaleźć odpowiedź? kiedy widzisz to ostrzeżenie, czy połączenie (z c3p0) jest zamknięte? czy jest wyciek z puli połączeń? – OhadR

Odpowiedz

0

Oczywiście musimy zamknąć sesję, ponieważ inaczej aplikacja może nie działać poprawnie.

Powinniśmy również starać się utrzymać leniwy obiekt zagnieżdżony, aby uzyskać lepszą wydajność i dodać obowiązkowe połączenia.

Jeśli chcesz uzyskać dostęp do elementu podrzędnego trzeba zastosować przyłączyć się do zapytania, tak że leniwy obiekt będzie ładowane np

class A{ 
     B b; 
} 

sql:

select * from A Left join B on A.bid = B.id 
Powiązane problemy