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?
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