2013-06-13 11 views
6

Mam pewne problemy z wydajnością podczas hibernacji, ponieważ zbyt wiele razy trafiają do bazy danych. Zbadam niektóre strategie pobierania. Chcę napisać kilka funkcjonalnych testów jednostkowych, aby moja aplikacja ewoluowała. Widzę, jak wiele instrukcji SQL jest wywoływanych.Policz instrukcje SQL w trybie hibernacji

Chcę wiedzieć, czy mogę policzyć, jak wiele instrukcji SQL są wywoływane. W tej chwili ustawiam show-sql na true, a następnie zliczam SQL w konsoli. Chcę to zrobić w kodzie, jeśli to możliwe. Czy można zliczyć, ile hibernacji SQL trafia do DB z kodem?

Dzięki

EDIT

Po @Aleksander Blomskøld odpowiedzi ....

Mój przypadek testowy jest

StatisticsService statisticsService = new StatisticsService(); 
Session session = entityManager.unwrap(Session.class); 
statisticsService.setSessionFactory(session.getSessionFactory()); 
statisticsService.setStatisticsEnabled(true); 

List<MyType> r= entityManager.createQuery("from MyType", MyType.class).getResultList(); 

System.out.println(statisticsService.getQueryExecutionCount()); 
System.out.println(statisticsService.getQueries()[0]); 

Hrabia wykonania zapytania jest podawana jako 1, a jeśli Patrzę na zapytanie, które mówi, że jest "od MyType"

Jednak w instrukcjach sql znajdujących się w logu widzę, że istnieją instrukcje SQL do pobrania MyType i wielu powiązanych klas. Tak naprawdę chcę znać wszystkie SQL, które trafiają do bazy danych z powodu wywołania "od MyType".

Czy to, czego wymagam, jest bardziej przejrzyste? Albo ja po prostu nadużywanie StatisticService

Dzięki

+1

baza danych prawdopodobnie nie ma lepszych sposobów, aby uzyskać heurystyki na ten temat niż „liczenie zapytania SQL”. Myślę, że masz na myśli "liczenie instrukcji SQL" btw. –

+0

poprawne @tieTYT to oświadczenia - zaktualizowałem kod – RNJ

+0

Być może mógłbyś rozważyć NProf? –

Odpowiedz

8

Włącz statystyki w Hibernate i korzystać z usługi statystyk. Po skonfigurowaniu fabryki sesji upewnij się, że ustawiłeś hibernate.generate_statistics = true. Można wówczas uzyskać dostęp do danych statystycznych za pośrednictwem JMX lub programowo:

//Enable statistics 
StatisticsService statisticsService = new StatisticsService(); 
statisticsService.setSessionFactory(sessionFactory); 
statisticsService.setStatisticsEnabled(true); 

// Do queries... 
//... 

///Print out stats: 
System.out.println(statisticsService.getQueryExecutionCount()); 
+0

Witajcie na @Aleksandrze, nie jestem pewien, czy to jest to, czego chcę. Zaktualizowałem pytanie ... już prawie jest, dzięki – RNJ

3

Możecie spróbować JDBC wrapper/proxy zestawy narzędzi tam.

Ten wygląda obiecująco dla Twojego zadania: JDBC Spy.

Cechy

  • dziennika wykonanie oraz czas iteracji wszystkich SQL
  • identyfikacji sprawozdań, które są wykonywane wielokrotnie
  • ślad stosu z konfigurowalnym głębokości dla wszystkich wymienionych sprawozdań
  • zapewnia statystyki dla wszystkich połączeń, instrukcji SQL, zestawów wyników
  • zapewnia wielkość wynikowego
  • dostarcza API, aby pobrać wszystkie informacje statystyczne
  • listę wszystkich instrukcji, które są obecnie realizowane
  • listę wszystkich wypowiedzi, które zostały wykonane, ale nie zostały zamknięte
  • notyfikuje (na przykładza pomocą śledzenia), jeśli czas wykonania instrukcji przekracza konfigurowalny próg
  • informuje, jeśli nie pamiętasz o zamknięciu zestawu wyników lub oświadczeniu przed zamknięciem połączenia
  • obsługuje różne rejestratory (log4j, rejestrowanie java, slf, ...)
  • wysuwany przez własnych słuchaczy

Ale istnieje wiele innych, jak log4dbc, jdbc-trace-wrapper itp

Powiązane problemy