Mierzenie ilość wykonanych zapytań do bazy danych

0

Zna ktoś może sposób jak można sprawdzić ile zostało wykonanych zapytań do bazy danych podczas wykonywania jakiejś metody?
Pobieram z bazy danych rekordy:

List <Test> list = test.findAll();

następnie lista przekazywana jest do metody, gdzie jest pętla przechodząca po wszystkich dniach roku, weryfikuje czy wszystkie dni mają odpowiednio zapisane dane, jeśli nie zwraca błąd itp.

@TrackExecutionTime
public void checkWholeYear(List<Test> list) {
    LocalDate now = dateService.getDateNow();
    LocalDate firstDay = now.with(firstDayOfYear());
    LocalDate lastDay = now.with(lastDayOfYear());
    while (firstDay.isBefore(lastDay))
    {
    	...  
    }
}

Nie wklejam całego kodu bo jest go sporo ale w pętli while występuje wiele miejsc gdzie wyciągane są dane z przekazanej listy.
Metoda wykonuje się bardzo długo, czas wykonania sprawdzam korzystając z tego rozwiązania: https://medium.com/@mailshine/spring-boot-measure-execution-time-using-spring-aop-and-aspectj-4590d7bd6bb2
Zakładam, że jest to związane z tym, że w encji Test jest kilka pól oznaczonych adnotacją:

@ManyToOne(fetch = FetchType.LAZY)

i za każdym razem w pętli jest strzał do bazy gdy chce wyciągną dane pola i przez to metoda działa tak wolno.
Nie wiem niestety jak to potwierdzić.

0

Zainteresuj się tematem Micrometer z Spring Bootem: https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/html/production-ready-metrics.html
Z tego co widzę to są specjalne metryki dla dataSource'ów.

Ewentualnie sprawdź po stronie bazy danych.

0

na szybko bez zabaw w metryki itd odpal logowanie zapytan to od razu w logach zobaczysz. Jak i tak przechodzisz po calej liscie to popraw pobieranie zeby od razu pobieralo liste z dociagnieciem pol lazy skoro zaraz sie do nich odwolujesz

0

Dzięki za odpowiedzi. Uruchomiłem logowanie zapytań i faktycznie jest tego dużo.
Finalnie problem rozwiązałem przez mapowanie listy encji na listę zwykłe klasy dto i przekazywanie jej dalej do metody, teraz działa jak należy :)

0

Jeszcze można sobie takie coś zrobić:

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    public void example() {
         var sf = entityManagerFactory.unwrap(SessionFactory.class);
         Statistics stats = sf.getStatistics();
         //i przykładowo:
         stats.clear();
         stats.getPrepareStatementCount(); //zwraca ile zapytań było od ostatniego clear()
         stats.getQueryCacheHitCount(); //ile razy z cache pobrało
         stats.getQueryCacheMissCount(); //ile razy nie pobrał z cache
    }

I wiele innych statsów jest, jak ktoś walczy z wydajnością w JPA to się przydaje w testach

1

Jeżeli pytasz w kontekście komercyjnego projektu to polecam Ci wpiąć system Datadog. Z automatu wepnie Ci się do JDBC i zacznie generować takie statystyki

screenshot-20230413105400.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1