2009-05-29 13 views
5

Niedawno zaczęliśmy używać Hibernate i nadal przyzwyczajamy się do jego działania.Jak wymusić hibernację, aby zwolnić pamięć po zamknięciu sesji?

Z rzeczy, które widzieliśmy, wynika z tego, że nawet po zamknięciu wszystkich sesji i znalezieniu referencji poza zakresem, hibernacja nadal zachowuje poprzednio używane wartości bazy danych w pamięci podręcznej.

Mamy kod, który odczytywany jest z zestawu tabel w wielu przejściach. Ponieważ cała pamięć jest uwalniana bardzo oszczędnie, późniejsze przejścia spowalniają do pełzania.

Czy istnieje sposób na wymuszenie hibernacji, aby wyczyścić pamięć podręczną?

Jednoznaczne wywołanie funkcji System.gc() nie pomaga. (Tak, wiem, że to jest sugestia)

Dodatkowe informacje: Zdecydowanie wyłączyliśmy pamięć podręczną drugiego poziomu.

+3

Zakładam, że nie używasz pamięci podręcznej drugiego poziomu Hibernate wtedy? Jakiej strategii używasz do zarządzania sesjami? "Session-per-thread"? –

+0

Używamy session-per-thread, a my jawnie wyłączyliśmy pamięć podręczną drugiego poziomu – StudioEvoque

Odpowiedz

10

Możesz spróbować wywołać Session.clear, aby wymusić wyczyszczenie pamięci podręcznej pierwszego poziomu. Pamiętaj, aby najpierw wywołać funkcję Session.flush, aby zapisać wszelkie oczekujące zmiany w bazie danych. Jeśli to "naprawi" problem, to podejrzewam, że coś nadal zawiera odwołanie do sesji, uniemożliwiając zbieranie śmieci z pamięci podręcznej. Może być konieczne uzyskanie zrzutu sterty programu, aby wykryć wyciek.

+0

"Naprawiono" problem :) Jak zasugerowałeś, sprawdzamy niektóre z naszych "HibernateUtils", aby zobaczyć, gdzie jesteśmy "Trzymaj się odniesień do sesji. – StudioEvoque

+0

Możesz również rozważyć użycie frameworka, takiego jak Spring, do zarządzania sesjami i transakcjami Hibernacji, jeśli jeszcze tego nie zrobiłeś. –

+0

Dzięki, ta sugestia pomogła mi rozwiązać problem, który zabijał moją aplikację Java na kilka ostatnich dni! – mahonya

2

Hibernate ma również opcjonalną pamięć podręczną drugiego poziomu, która może być w grze. Zgadzam się z Robem, najprostszym sposobem, aby się dowiedzieć, jest sprawdzenie, co jeszcze jest w pamięci po zakończeniu sesji.

Obecnie moim ulubionym narzędziem jest YourKit, które jest komercyjne i niezupełnie tanie. Zwykle oferowali (i mogą nadal oferować) opcję osobistej licencji, która była bardzo tania (99 USD IIRC). Użyłem YourKit do precyzyjnego wykonania tego zadania podczas rozwiązywania problemów z używaniem sterty w Alfresco ECM. Dostępne są także inne narzędzia (np. CodeGear JGears), które, jak rozumiem, działają bardzo dobrze.

Można rozważyć zastosowanie produktu w trybie oceny - jeśli uzna to problem może zarobić na swoje utrzymanie;)

+0

Jeśli Wyjaśnienie GC nie pomoże, obiekty muszą nadal znajdować się gdzieś w kodzie. Profiler z wykrywaniem wycieków pamięci jest najszybszą ścieżką do odpowiedzi IMHO, ponieważ * zobaczysz * ścieżkę powodującą wyciek. Powodzenia! –

Powiązane problemy