Hibernate i szybkie ładowanie dużej ilości danych

Odpowiedz Nowy wątek
2018-10-31 14:29
0

Witam. Piszę sobie aplikację w technologiach Spring Boot i Hibernate dodatkowo je poznając. Mam pewien problem. Mam encję użytkownika, który posiada kilka relacji. Teoretycznie jeśli chcę wyświetlać niektóre z tych dancyh to robię to poprzez Lazy Loading i mam dodatkowy obiekt, taki helper, który zawiera tylko te dane które mi są potrzebne. Wszystko jest okej ale problem polega na tym, że w pewnym momencie potrzebne mi są wszystkie dane każdego użytkownika do przetwarzania w serwisie. Polega to na tym, że do jakiegoś użytkownika ma zostać dobierana para, na podstawie różnych parametrów. Aby to zrobić potrzebuję wydostać wszystkie dane każdego usera i potem iterować po każdym i kalkulować jego dopasowanie do tego co wykonał zapytanie. Można w sumie zrobić Eager Loading ale też dołączać sobie te dane w zapytaniu. Jednak samo w sobie jest to problemem bo jeśli posiadam do 60 użytkowników to jeszcz da się to jakoś wybaczyć ponieważ pobieranie użytkowników z bazy nie trwa jakoś długo (stosunkowo). Jednak jeśli mam ich więcej (docelowo koło 1k) to już robi się problem ponieważ trzeba długo czekać a czasami nawet przepełnia się stos (przy kilku zapytaniach), Moje pytanie brzmi: w jaki sposób efektywnie pobrać wszystkie dane każdego użytkownika aby móć potem przetwarzać sobie dane każdego z nich?

Pozostało 580 znaków

2018-10-31 17:50
0

Jeżęli aby wykonać operacje defakto musisz pobrać całą baze to proponuje procedurę w DB

Pozostało 580 znaków

2018-10-31 18:24
0

Podałeś dość mało szczegółów więc ciężko stwierdzić jakie rozwiązanie byłoby najlepsze ale opcji masz przynajmniej kilka

  • użyć dodatkowego źródła danych, np jakiejś niekoniecznie relacyjnej bazy danych z innym modelem, gwarantującym szybszy odczyt. Niestety powoduje to ryzyko powstania niespójności w danych.
  • użyć cache drugiego poziomu dla Hibernate - znajdziesz w google sporo na ten temat
  • użyć cache w serwisie, w którym przetwarzasz dane - w pewnych przypadkach może to mieć sens ale jest to potencjalne źródło problemów
  • zrównoleglić proces pobierania i przetwarzenia danych poprzez jakiś rodzaj stronicowania. Jeżeli w Twoim przypadku pobieranie danych dla 60 encji odbywa się w sensownym czasie to pobierz 60 encji, zacznij je przetwarzać a w tym czasie pobieraj następne 60. Jeżeli korzystasz z gołego Hibernate to nie wiem na ile wspiera coś takiego ale w Spring Data JPA masz gotowe PagingAndSortingRepository.

Procedura w DB to ostatnie czego bym się chwytał.

To w hibernate nie da się zrobić joina i projekcji na jakieś własne DTO, że trzeba pisać procedury albo ładować pół bazy do pamięci? :O - mad_penguin 2018-11-01 00:17
Pewnie że się da. Ale autor wątku pyta o wyciągnięcie wszystkich powiązanych z encją danych. Jakiej projekcji by nie zastosować i tak trzeba to wszystko wyciągnąć. - dymul 2018-11-01 00:26

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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