2009-04-24 12 views
5

Mam aplikację Java typu open source, która używa Hibernate i HSQLDB do utrwalania. We wszystkich moich testach zabawkowych wszystko biegnie szybko i wszystko jest dobrze. Mam klienta, który nieprzerwanie pracuje przez kilka miesięcy, a jego baza danych znacznie się rozrosła, a wydajność stopniowo spadła. W końcu przyszło mi do głowy, że baza danych może być problemem. O ile mogę powiedzieć z instrukcji log, wszystkie obliczenia na serwerze odbywają się szybko, więc jest to zgodne z hipotezą, że DB może być wadliwy.Jak ustawić wydajność aplikacji hsqldb/hibernate

Wiem, jak normalnie profilować program, aby dowiedzieć się, gdzie znajdują się gorące punkty i co zajmuje znaczną ilość czasu. Ale wszystkie programy profilujące, które znam, monitorują czas wykonywania programu i nie udzielają żadnej pomocy w zakresie wywoływania zasobów zewnętrznych. Jakich narzędzi używają ludzie do profilowania programów używających zewnętrznych wywołań db, aby dowiedzieć się, gdzie optymalizować wydajność?

Mała ślepa wyszukiwarka znalazła już kilka gorących punktów - zauważyłem połączenie, w którym wymieniałem wszystkie przedmioty danej klasy, aby dowiedzieć się, czy są jakieś. Zmiana jednej linii do kryterium [.setMaxResults (1)] zmieniła to połączenie z półsekundy na praktycznie natychmiastowe. Widzę też miejsca, w których wielokrotnie pytam o to samo pytanie z db w ramach pojedynczej transakcji. Nie znalazłem jeszcze odpowiedzi na pytanie, ale to, czego naprawdę chcę, to narzędzie, które pomoże mi bardziej systematycznie szukać tego typu rzeczy.

Odpowiedz

3

Niestety, o ile wiem, nie ma na to narzędzia.

Ale są pewne rzeczy, które warto sprawdzić:

  • Używasz chętny załadunek zamiast leniwy załadunku? W opisie problemu naprawdę wygląda na to, że nie używasz leniwego ładowania ...
  • Czy włączyłeś i poprawnie skonfigurowałeś buforowanie drugiego poziomu? W tym pamięć podręczna zapytań? Mechanizm buforowania hibernacji jest niezwykle wydajny i elastyczny.
  • Czy rozważyłeś zastosowanie wyszukiwania w trybie hibernacji? W zależności od zapytania, indeks pełnego tekstu w trybie Hibernuj na górze Apache Lucene może przyspieszyć zapytania (ponieważ system indeksowania jest tak potężny).
+0

Nie dokonałem żadnego dostrajania wydajności w konfiguracji DB. Założę się, że mój problem byłby raczej źle sformułowany lub zbyt często zadawał niewłaściwe pytanie. Sądzę, że chciałbym znaleźć sposób na zmniejszenie liczby zapytań i ich wydatków w pierwszej kolejności, a następnie (po zmniejszeniu zużycia o 80%) przyspieszenie samego db poprzez zastosowanie buforowania i innych sztuczek na tym zmniejszonym obciążeniu. Ale nie jestem ekspertem w dostrajaniu użycia DB. Czy sugerowałbyś dostrojenie DB przed aplikacją? – PanCrit

+0

Jeśli masz pewność, że problem jest w hibernacji, dostrojenie DB nie pomoże. Przed strojeniem należy użyć narzędzia do profilowania lub czegoś, co pomaga dokładnie zidentyfikować źródło problemów z wydajnością, a następnie go zoptymalizować. Niestety, nie ma łatwego sposobu. Dobra wiadomość jest taka: wszystkie IDE mają teraz przyzwoitą obsługę profilowania. – razenha

0

Ile danych przechowujesz w HSQLDB? Nie wydaje mi się, żeby działał dobrze przy zarządzaniu dużymi zbiorami danych, ponieważ po prostu przechowuje wszystko w plikach ...

+0

Nie sądzę, że jest tak wielki w porównaniu do tego, co może zrobić hsqldb. Plik .script ma prawie 300 tysięcy linii (32891015 znaków). Spojrzałem wcześniej, a w DB zapisano 3000 transakcji i 150 000 transakcji. Może to być łącznie 250 tysięcy wierszy nad wszystkimi obiektami. – PanCrit

0

Było kiedyś narzędzie o nazwie IronGrid/IronEye/IronTrackSql, które zrobiło dokładnie to, czego szukasz. Niestety, wyszli z biznesu. Zrobili open source swój produkt w ostatniej chwili, ale od dłuższego czasu nie udało mi się znaleźć źródła lub pliku binarnego.

Ostatnio korzystałem z profilowania YourKit, częściowo dlatego, że można ustawić czas SQL w celu znalezienia najczęściej używanych instrukcji i najdłużej działających instrukcji. Nie jest tak szczegółowy jak IronGrid, ale dostarcza cennych informacji. W mojej ostatniej sesji dostrajania bazy danych/hibernacji problem okazał się hibernacją oraz tym, jak i kiedy był on chętny do leniwego ładowania i dodawał pewne rozsądne przesłonięcia domyślne przy wybieraniu dużej liczby elementów.

0

Wiele raportów tutaj. Mam wyniki i wciąż szukam dobrych odpowiedzi.

znalazłem kilka narzędzi, które pomagają:

VisualVM (z BTrace lub wbudowanego śladowe) twierdzi, aby pomóc w identyfikacji, ale nie udało się znaleźć żadnego narzędzia, które pokazuje taktowanie w wywołaniach metod.

YourKit jest uważany za przydatny; Poprosiłem o licencję open source.

Najbardziej przydatną rzeczą, jaką znalazłem, jest wbudowana statystyka Hibernate. Jeśli ustawisz hibernate.generate_statistics true we właściwościach, możesz wysłać sessionFactory.getStatistics() i zobaczyć szczegółowe statystyki dotyczące obiektów, które zostały zapisane i pobrane, a także co wpływa na pamięć podręczną. Znalazłem jedną z odpowiedzi, które chciałem w qeuryStatistics, która raportuje dla każdego skompilowanego zapytania, trafienia i pomyłki w pamięci podręcznej, liczbę uruchomień zapytania, liczbę zwróconych wierszy oraz czasy wykonania ze średnią, maksymalną i minutą. Te czasy sprawiły, że stało się jasne, dokąd zmierza.

Potem zrobiłem trochę czytania na temat buforowania. Propozycja Razenha była właściwa. [Na razie zaznaczę jego odpowiedź.] Dodałem hibernate.cache.use_query_cache true do moich właściwości i dodałem query.setCacheable(true); do większości moich zapytań. Dodałem także <cache usage="read-write"/> do kilku moich plików .hbm.xml. Obecnie większość moich statystyk pokazuje ogromną przewagę wyników w pamięci podręcznej, a wydajność jest znacznie lepsza.

Nadal chciałbym skorzystać z narzędzi, które pomogą mi śledzić terminy wykonania, dzięki czemu mogę zaatakować najgorsze problemy, a nie najbardziej oczywiste, ale jest to duża pomoc. Może jedno z powyższych narzędzi do śledzenia okaże się pomocne.

+0

Yourkit jest przydatny i łatwy w użyciu. – PanCrit

0

W Terracotta 3.1 można monitorować wszystkie te statystyki w czasie rzeczywistym za pomocą konsoli Terracotta Developer Console. Możesz zobaczyć wykresy historyczne dla statystyk pamięci podręcznej i wyświetlić statystyki hibernate lub statystyki cache dla całego klastra lub dla każdego węzła.

Terakota jest open source. Więcej szczegółów i pobierz pod adresem Terracotta for Hibernate.

Powiązane problemy