Spring - jak NIE ładować danych z bazy do pamięci?

0

Witam, jestem b.początkujący w Javie/Springu, dodatkowo to mój pierwszy post na tym forum, także proszę o wyrozumiałość :)
Jest sobie taki kod:

List<Reservation> reservationList = reservationRepository.findAll()
                .stream()
                .filter(t -> !t.getId().equals(id))
                .collect(Collectors.toList());

Na tej liście robię sobie potem różne potrzebne mi anyMatch, filtry itp. Na code review dostałem następującą uwagę:

właśnie wyciągnąłeś wszystkie rezerwacje z DB do RAM. Niestety w dużym (normalnym) systemie kończy się to OutOfMemoryException. Spróbuj ograniczyć ilość danych jakie musisz obrabiać w Java

No rzeczywiście o tym nie pomyślałem, rzeźbiąc sobie w domciu mały projekcik na kilka przykładowych rekordów :) No więc pytanie: jak ogarniać takie tematy w Springu?

2

Skoro nie chcesz pobierać wszystkich rekordów to nie rób findAll(), tylko stwórz findById(), findByXYZ(), findFirst(), findTopN() etc. i tego używaj.

0

Skoro nie chcesz pobierać wszystkich rekordów to nie rób findAll(), tylko stwórz findById(), findByXYZ(), findFirst(), findTopN() etc. i tego używaj.

Tylko to mi nic nie da, bo:

        if (reservationList
                .stream()
                .anyMatch(date -> (reservationBegin.plusSeconds(60).isAfter(date.getBeginDate()) && reservationBegin.isBefore(date.getEndDate())))
                ||
                reservationList
                        .stream()
                        .anyMatch(date -> (reservationBegin.isBefore(date.getBeginDate()) && reservationEnd.isAfter(date.getBeginDate())))) {
            throw new IllegalArgumentException("Room is already reserved at this time");
        }

Z każdego rekordu muszę wyciągnąć jednocześnie dwa pola: beginDate oraz endDate, ich pojedyncze szukanie w DB nic mi nie da, bo ja je muszę ze sobą porównywać w kontekście danego, konkretnego rekordu, żeby miało to sens w przypadku mojej apki

1
  1. Filtruj na poziomie zapytania do DB
  2. Niemniej ja sie trochę nie zgodzę z tym review! Gdyby ten twój system miał działać szybko i sprawnie, to właśnie trzymanie danych w pamięci byłoby poprawnym rozwiązaniem! Jakiśtam persistent store mozesz mieć, zeby po restarcie serwera nie zgubić danych, ale to tyle, reszta powinna ładnie śmigać w pamięci. Z tym out-of-memory to bym nie przesadzał, mój domowy laptop ma 32GB ramu ;] To jest taki trochę antyczny problem, z czasów kiedy RAMu było mało i trzeba było oszczędzać. Dzisiaj często jednak aplikacja operuje na in-memory-cache, a dane na dysku w jakiejś bazie leżą tylko po to żeby były gdzieś utrwalone, często w ogóle są tam zapisywane z eventual consistency, asynchronicznie, podczas gdy sama aplikacja operuje tylko na tym co w pamięci.
0

Dziękuję za odpowiedzi :) Problem rozwiązany, pozdrawiam :)

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