GMI Software
Główne obszary
AI & Automatyzacje
Od procesu i business case do produkcji
Aplikacje mobilne
iOS, Android, React Native
E-commerce headless & B2B
Sklepy, platformy sprzedaży, integracje ERP/PIM
Usługi komplementarne
AI-gen developmentAnalityka e-commerce mobileProduct Discovery & DesignBackend, API & IntegracjeUtrzymanie & AudytyProces DDT
Nie wiesz co wybrać? Zamów konsultację
Nasze projekty
Case studies i referencje
Biblioteka aplikacji
Przykłady zastosowań
MobileNasza specjalizacja
React Native
E-commerceNasza specjalizacja
Usługa: e-commerce & B2BZaawansowany e-commerceMedusaJS
Frontend & QA
Next.jsReactTypeScriptPlaywrightMaestro
Backend, Bazy & Cloud
Node.jsNestJSPostgreSQLDockerAWS
Innowacje w E-commerce
Konfiguratory 3D (BabylonJS)Automatyzacje i Agenci AIRAG i bazy wiedzySoftware house AI-nativeZobacz wszystkie usługi AI
Zobacz wszystkie technologie
O nas
Nasza historia i wartości
Kariera
Dołącz do zespołu
Kontakt
Skontaktuj się z nami
Skontaktuj się
Sprint AI dla biznesu
Usługi
Aplikacje mobilneE-commerce headless & B2BWszystkie usługi
Projekty i wyniki
Technologie
Next.jsNode.jsAWSCały stack technologiczny
Poznaj GMISkontaktuj się
Wróć do bloga
Technologie
Zaktualizowano: 11 lipca 2026· Pierwsza publikacja: 27 lutego 2026
22 min czytania

NestJS, Prisma i PostgreSQL w skali. Jak diagnozować wolną część serwerową, pulę połączeń i zapytania N+1

Mikołaj Lehman, CEO i założyciel GMI Software
Mikołaj Lehman
CEO i założyciel GMI Software

Mikołaj Lehman jest CEO i założycielem GMI Software. Na blogu opisuje decyzje związane z aplikacjami mobilnymi, e-commerce oraz realizacją produktów cyfrowych.

  • Aplikacje mobilne i React Native
  • Headless i e-commerce B2B
  • MedusaJS
  • Realizacja produktów cyfrowych

Skalowanie NestJS, Prisma i PostgreSQL nie polega na kupieniu większej bazy. Najpierw trzeba zmierzyć p95/p99, opóźnienia, pulę połączeń, wolne zapytania, problem N+1, indeksy, transakcje, kolejki i pamięć podręczną. Dopiero po rozpoznaniu biznesu, projektu i technologii GMI może odpowiedzialnie zaproponować stałą cenę na naprawę albo przebudowę części serwerowej.

Krótka odpowiedź: Prisma nie jest problemem, brak diagnostyki jest problemem

Prisma ORM jest bardzo dobrym narzędziem dla zespołów TypeScript, które budują część serwerową w NestJS i potrzebują szybko dostarczać stabilne interfejsy dla aplikacji. Problem zaczyna się wtedy, gdy zespół traktuje Prismę jak warstwę, która automatycznie rozwiąże model danych, wydajność zapytań, pulę połączeń i zachowanie PostgreSQL pod ruchem produkcyjnym.

W małej pierwszej wersji produktu wolne zapytanie jest irytujące. W systemie sprzedażowym, abonamentowym albo operacyjnym to ryzyko przychodu, obsługi klienta i kosztów chmury. Objawy zwykle są podobne: część serwerowa działała świetnie w środowisku testowym, potem przyszło 5-10 tysięcy aktywnych użytkowników, p95 zaczęło rosnąć, baza doszła do limitu połączeń, a zespół próbował ratować sytuację większą instancją PostgreSQL.

Dojrzała decyzja nie brzmi “Prisma czy surowy SQL?”. Brzmi: które ścieżki biznesowe muszą zachować bezpieczeństwo typów i szybkie tempo prac, które zapytania wymagają ręcznej kontroli, gdzie potrzebujemy narzędzia do puli połączeń, gdzie indeksu, gdzie pamięci podręcznej, a gdzie zmiany modelu biznesowego. Ten artykuł pokazuje, jak GMI podchodzi do takiej diagnozy przed kosztowną przebudową.

Co realnie oznacza “skalowanie NestJS, Prisma i PostgreSQL”?

Skalowanie części serwerowej nie oznacza jednego ruchu infrastrukturalnego. W zestawie NestJS + Prisma + PostgreSQL skala jest sumą kilku ograniczeń: ile zapytań generuje jedna akcja użytkownika, ile danych pobiera widok aplikacji, ile połączeń utrzymują procesy Node.js, jak długo trwają transakcje, jak działają indeksy i czy krytyczne ścieżki da się szybko zdiagnozować.

NestJS daje strukturę: moduły, kontrolery, dostawców, wstrzykiwanie zależności, strażników dostępu, przechwytywacze, walidację, kolejki i połączenia z innymi systemami. Prisma daje dostęp do bazy z bezpieczeństwem typów i czytelny model danych. PostgreSQL daje silnik transakcyjny, indeksy, JSONB, blokady, plan wykonania i kontrolę nad danymi. Skala pojawia się wtedy, gdy te trzy warstwy pracują jako jeden system, a nie trzy osobne technologie.

Dlatego w diagnozie nie zaczynamy od opinii o narzędziu. Zaczynamy od ścieżek użytkownika: logowanie, lista zamówień, finalizacja zamówienia, wyszukiwarka, panel administracyjny, import danych, raport, zdarzenie zewnętrzne i synchronizacja z systemem finansowo-magazynowym. Dopiero potem patrzymy, który element architektury jest wąskim gardłem.

Grafika do artykułu: NestJS, Prisma i PostgreSQL w skali: diagnoza, architektura, koszty
Grafika do artykułu: NestJS, Prisma i PostgreSQL w skali: diagnoza, architektura, koszty

Pierwsza diagnoza: nie patrz na średnią, patrz na p95 i p99

Średnia odpowiedź części serwerowej potrafi ukryć system, który zaczyna się rozpadać. Jeśli 90% żądań działa w 120 ms, ale finalizacja zamówienia, import albo lista zamówień czasem trwa 4-8 sekund, użytkownik i tak odczuwa produkt jako niestabilny. Przy skali liczy się ogon: p95, p99, przekroczenia czasu odpowiedzi, ponowienia, błędy 5xx i liczba żądań czekających na połączenie z bazą.

Minimalna diagnostyka powinna obejmować powiązanie ścieżki komunikacji w NestJS z zapytaniami Prisma i planem PostgreSQL. Prisma Query Insights może pokazać, które zapytania są wolne, kosztowne i skąd pochodzą. Prisma dokumentuje też przypisywanie zapytań przez komentarze SQL, co pomaga powiązać SQL z modelem, akcją i kształtem zapytania ORM.

W praktyce GMI szuka wzoru, nie pojedynczego wolnego żądania. Czy problem rośnie w godzinach szczytu? Czy dotyczy jednej ścieżki komunikacji czy całej bazy? Czy p95 rośnie po wdrożeniu, po imporcie danych, po kampanii marketingowej, po dodaniu filtra w sprzedaży internetowej? Bez tej odpowiedzi przebudowa jest zgadywaniem.

Pula połączeń: dlaczego większa baza nie zawsze pomaga

PostgreSQL ma limit jednoczesnych połączeń. Dokumentacja PostgreSQL opisuje `max_connections` jako maksymalną liczbę równoczesnych połączeń i ostrzega, że zwiększenie tej wartości podnosi alokację zasobów, w tym pamięć współdzieloną. To ważne, bo “dajmy 1000 połączeń” nie jest darmowym skalowaniem.

Prisma Client automatycznie łączy się przy pierwszym zapytaniu, tworzy pulę połączeń i zwykle nie wymaga ręcznego `$connect()` ani `$disconnect()`. Dokumentacja Prisma ostrzega jednak, że tworzenie wielu instancji `PrismaClient` może wyczerpać pulę połączeń, zwłaszcza w środowiskach bezserwerowych albo uruchamianych blisko użytkownika. W klasycznym serwerze należy współdzielić jedną instancję klienta.

Przy wielu procesach NestJS, automatycznym skalowaniu, procesach roboczych, zadaniach w tle i zdarzeniach zewnętrznych problem potrafi wrócić mimo poprawnej jednej instancji klienta. Wtedy rozważa się PgBouncer albo Prisma Accelerate. Prisma dokumentuje, że zewnętrzne narzędzie do puli połączeń działa między Prisma Client a bazą i redukuje liczbę procesów, które baza musi obsłużyć w danym momencie. Dla PgBouncera Prisma wymaga trybu transakcyjnego.

N+1 i pobieranie zbyt szerokich danych: najcichszy zabójca wydajności

Problem N+1 występuje wtedy, gdy aplikacja pobiera listę rekordów, a potem dla każdego rekordu wykonuje dodatkowe zapytanie. Prisma pokazuje ten problem na przykładzie GraphQL: funkcja pobierająca listę użytkowników wykonuje jedno zapytanie, a funkcja pobierająca ich wpisy uruchamia kolejne zapytanie dla każdego użytkownika. Przy 50 użytkownikach robi się 51 podróży do bazy.

Prisma ma narzędzia do walki z N+1, ale trzeba rozumieć ich granice. Dokumentacja wskazuje grupowanie `findUnique()` przez mechanizm zbierający podobne zapytania oraz możliwość użycia `relationLoadStrategy: "join"`, żeby wykonać zapytanie przez JOIN i ograniczyć liczbę zapytań do bazy. To nie jest jednak magiczny przełącznik dla każdej ścieżki komunikacji z aplikacją. Czasem JOIN jest najlepszy, czasem dwa mniejsze zapytania są bezpieczniejsze dla pamięci i planu wykonania.

Drugi problem to pobieranie zbyt szerokiego zakresu danych. `include` bywa wygodne, ale potrafi pobierać całe sieci relacji, których ekran albo ścieżka komunikacji z aplikacją nie potrzebuje. W ścieżkach krytycznych GMI preferuje świadome `select`, obiekty danych projektowane pod konkretny przypadek użycia i osobne zapytania dla danych, które nie muszą być częścią pierwszej odpowiedzi.

Indeksy, JSONB i model danych: baza musi pasować do produktu

PostgreSQL przypomina w dokumentacji, że indeksy przyspieszają odnajdywanie konkretnych wierszy, ale dodają narzut do całego systemu, więc trzeba ich używać sensownie. To jest sedno pracy przy skalowaniu: indeks powinien pasować do realnego filtra, sortowania, zakresu dat, identyfikatora klienta, statusu zamówienia albo wyszukiwarki, a nie tylko do pola, które “może kiedyś się przyda”.

W systemach sprzedażowych i dla klientów firmowych często pojawia się JSONB: parametry produktu, konfiguracje, dane z połączeń zewnętrznych, zdarzenia z innych systemów, odpowiedzi systemu finansowo-magazynowego. PostgreSQL ma rozbudowane operatory i ścieżki JSON, ale JSONB nie powinien być wymówką dla braku modelu biznesowego. Jeśli filtr staje się krytyczny dla sprzedaży albo panelu operacyjnego, trzeba rozważyć indeks, denormalizację, widok zmaterializowany albo osobną tabelę.

Prisma dobrze opisuje relacje i typy, ale nie zdejmie z zespołu odpowiedzialności za plan zapytania. W GMI patrzymy, czy model danych odpowiada pytaniom biznesowym: “pokaż dostępne produkty w magazynie”, “pokaż zamówienia wymagające interwencji”, “policz marżę dla kampanii”, “znajdź klientów zagrożonych odejściem”. Jeśli model tego nie wspiera, samo przepisywanie kodu nie wystarczy.

Kiedy zostawić Prismę, a kiedy zejść do surowego SQL

W dojrzałej części serwerowej Prisma i surowy SQL nie są religiami, tylko narzędziami. Prisma powinna zostać tam, gdzie wygrywa bezpieczeństwo typów, szybkość prac, czytelność domeny i powtarzalne operacje tworzenia, odczytu, aktualizacji oraz usuwania danych. Surowy SQL ma sens tam, gdzie ścieżka komunikacji jest krytyczna biznesowo, plan zapytania musi być kontrolowany ręcznie albo ORM utrudnia użycie konkretnej funkcji PostgreSQL.

Typowe miejsca dla surowego SQL to ciężkie raporty, panele nad milionami rekordów, wyszukiwarki z rankingiem, operacje hurtowe, okna czasowe, CTE, widoki zmaterializowane, blokady, skomplikowane agregacje i fragmenty, w których zespół musi analizować `EXPLAIN ANALYZE` linia po linii. To nie oznacza rezygnacji z Prismy w całym projekcie.

Największy błąd to przepisywanie wszystkiego “bo ORM jest wolny”. Taka przebudowa często niszczy tempo zespołu i nie usuwa prawdziwego problemu. Lepszy model: zostaw 80-90% typowego kodu w Prisma, a najbardziej kosztowne 10-20% ścieżek przenieś do świadomie zaprojektowanych funkcji zapytań, testów regresji i wglądu w działanie systemu.

NestJS: skala to nie tylko Fastify

NestJS dokumentuje, że domyślnie używa Express, ale może korzystać z innych bibliotek przez adaptery, na przykład Fastify. Dokumentacja wskazuje Fastify jako szybszą alternatywę w testach porównawczych i dobry wybór, gdy bardzo wysoka wydajność HTTP jest priorytetem. To jest przydatne, ale nie powinno być pierwszym ruchem przy wolnej części serwerowej.

Jeśli 80% czasu żądania schodzi w bazie, zmiana adaptera HTTP nie naprawi produktu. W NestJS najpierw sprawdzamy cykl obsługi żądania: walidację, przechwytywacze, serializację, strażników dostępu, pamięć podręczną, wywołania zewnętrzne, kolejki, transakcje i liczbę zapytań Prisma na ścieżkę komunikacji. Dopiero potem decydujemy, czy Fastify, proces roboczy, kolejka, pamięć podręczna albo podział modułu ma sens.

Dla systemów GMI najważniejsza jest przewidywalność. Część serwerowa systemu sprzedażowego albo operacyjnego powinna mieć limity, przekroczenia czasu odpowiedzi, zasady ponawiania prób, idempotencję, kontrole zdrowia systemu, ograniczanie liczby żądań, ustrukturyzowane zapisy zdarzeń, śledzenie zdarzeń i ostrzeżenia. Bez tego skala jest szczęściem, nie architekturą.

Plan naprawy: od “baza pada” do kontrolowanej przebudowy

Naprawa części serwerowej w produkcji wymaga sekwencji, nie heroicznego zrywu. Najpierw trzeba zatrzymać krwawienie: ograniczyć najdroższe ścieżki komunikacji z aplikacją, dodać limity czasu odpowiedzi, wyłączyć niekrytyczne zadania w tle, zabezpieczyć pulę połączeń i odzyskać wgląd w działanie systemu. Dopiero potem można zmieniać model danych albo przepisywać zapytania.

W rozpoznaniu biznesu, projektu i technologii GMI zbiera kod, schemat Prisma, migracje, zapisy wolnych zapytań PostgreSQL, metryki chmury, listę ścieżek komunikacji, wolumen danych, połączenia z innymi systemami, zadania w tle, oczekiwania biznesowe i okna wdrożeniowe. Wynikiem nie jest ogólna rekomendacja “trzeba zoptymalizować”. Wynikiem jest mapa ryzyk, kolejność działań, zakres pierwszej sensownej naprawy i decyzja, czy da się to wycenić w stałej cenie.

Najlepsze naprawy są nudne: jedno krytyczne połączenie mniej w czasie obsługi żądania, jeden indeks mniej ryzykowny, jedna transakcja krótsza, jedna kolejka odciążająca czas odpowiedzi, jeden panel diagnostyczny więcej. Po kilku takich krokach system przestaje być tajemnicą i zaczyna być zarządzalny.

Lista kontrolna dla dyrektora technologii przed diagnozą NestJS + Prisma

Jeśli chcesz szybko ocenić, czy problem jest w NestJS, Prisma, PostgreSQL czy architekturze produktu, przygotuj poniższe dane przed rozmową z partnerem technicznym. To skraca rozpoznanie projektu i zmniejsza ryzyko otwartej, niekontrolowanej przebudowy.

  1. Lista ścieżek komunikacji i zadań w tle o największym ruchu, koszcie i znaczeniu biznesowym.
  2. Metryki p50, p95, p99, przekroczeń czasu odpowiedzi, 5xx i błędów połączeń do bazy.
  3. Zapisy wolnych zapytań PostgreSQL oraz przykłady planów `EXPLAIN ANALYZE`.
  4. Schemat Prisma, migracje, indeksy, relacje i miejsca użycia `include` oraz surowego SQL.
  5. Konfiguracja `PrismaClient`, liczba instancji aplikacji, procesów roboczych i puli połączeń.
  6. Opis połączeń z innymi systemami, zdarzeń zewnętrznych, importów, zadań cyklicznych i zadań wsadowych obciążających bazę.
  7. Najważniejsze ścieżki użytkownika: finalizacja zamówienia, panel administracyjny, raporty, wyszukiwanie, synchronizacja.
  8. Okna wdrożeniowe, tolerancja na niedostępność, plan powrotu i odpowiedzialność po stronie biznesu.

Źródła i dalsza lektura

Zarządzanie połączeniami w Prisma: dokumentacja opisuje leniwe łączenie, pulę połączeń, `$connect()`, `$disconnect()` oraz rekomendację współdzielenia jednej instancji `PrismaClient` w długo działających aplikacjach.

Optymalizacja zapytań w Prisma: dokumentacja opisuje Query Insights, częste przyczyny wolnych zapytań, operacje hurtowe, wyczerpanie puli połączeń, N+1, mechanizm zbierania podobnych zapytań i `relationLoadStrategy: "join"`.

PgBouncer w Prismie: dokumentacja wyjaśnia, że zewnętrzne narzędzie do puli połączeń redukuje liczbę procesów obsługiwanych przez bazę i że PgBouncer musi działać w trybie transakcyjnym dla niezawodnej pracy z Prisma Client.

Połączenia PostgreSQL: dokumentacja `max_connections` pokazuje limit równoczesnych połączeń i koszt zwiększania tej wartości dla zasobów serwera.

Indeksy PostgreSQL i typy JSON: dokumentacja przypomina, że indeksy przyspieszają odczyt, ale dodają narzut, a JSON/JSONB wymaga świadomego projektowania zapytań i operatorów.

Wydajność NestJS: dokumentacja opisuje adapter Fastify jako szybszą alternatywę dla Express w scenariuszach, gdzie wysoka wydajność HTTP jest priorytetem.

Zobacz też: nasz przewodnik po PostgreSQL RLS, kiedy dzielić mikroserwisy NestJS, architekturze zdarzeniowej w sprzedaży internetowej oraz aplikacji mobilnej i części serwerowej od jednego partnera.

Najczęstsze pytania

Czy Prisma nadaje się do zaplecza NestJS w dużej skali?
Tak, Prisma może działać w dużej skali, jeśli zespół kontroluje pulę połączeń, liczbę instancji PrismaClient, N+1, zbyt szerokie pobieranie danych, indeksy, transakcje i wolne zapytania. Prisma przyspiesza prace, ale nie zastępuje diagnostyki PostgreSQL ani świadomego modelowania danych.
Co najczęściej spowalnia część serwerową NestJS z Prismą?
Najczęstsze przyczyny to N+1, zbyt szerokie pobieranie danych przez `include`, brak indeksów, zbyt długie transakcje, wiele instancji PrismaClient, brak narzędzia do puli połączeń przy automatycznym skalowaniu, ciężkie raporty w czasie obsługi żądania oraz połączenia z innymi systemami lub zadania działające w godzinach szczytu.
Czy PgBouncer jest zawsze potrzebny przy Prisma i PostgreSQL?
Nie. W prostym, długo działającym serwerze często wystarczy jedna współdzielona instancja PrismaClient i poprawne limity. PgBouncer lub Prisma Accelerate warto rozważyć przy automatycznym skalowaniu, wielu procesach, architekturze bezserwerowej, procesach roboczych lub objawach wyczerpywania puli połączeń PostgreSQL.
Kiedy użyć surowego SQL zamiast Prisma?
Surowy SQL ma sens dla krytycznych raportów, paneli, agregacji, rankingów, CTE, widoków zmaterializowanych, operacji hurtowych, blokad i zapytań, które trzeba analizować ręcznie przez EXPLAIN ANALYZE. Nie trzeba przepisywać całej aplikacji; zwykle wystarczy wydzielić najbardziej kosztowne ścieżki.
Czy zmiana Express na Fastify rozwiąże problem wydajności NestJS?
Czasem pomoże, ale rzadko jest pierwszą odpowiedzią. Jeśli większość czasu żądania schodzi w PostgreSQL, połączeniu z innym systemem albo transakcji, adapter HTTP nie usunie wąskiego gardła. Najpierw trzeba zmierzyć cykl obsługi żądania, zapytania Prisma, indeksy, połączenia i p95/p99.
Jak GMI wycenia naprawę zaplecza NestJS, Prisma i PostgreSQL?
GMI zaczyna od rozpoznania projektu: kod, schemat Prisma, migracje, zapisy wolnych zapytań PostgreSQL, metryki chmury, ścieżki komunikacji, zadania w tle, połączenia z innymi systemami i ścieżki biznesowe. Dopiero po diagnozie można ustalić zakres naprawy, priorytety, ryzyka i stałą cenę. Bez diagnozy stała cena byłaby zgadywaniem.

Treść zaktualizowano: 11 lipca 2026

Udostępnij artykuł:

Powiązane artykuły

Technologie

React Native czy aplikacje natywne w 2026: decyzja biznesowa, nie religia technologiczna

Najlepszy wybór nie zależy od tego, która technologia ma głośniejszych fanów, tylko od ryzyka produktu: czasu wejścia na rynek, kosztu utrzymania, dostępu do sprzętu, wydajności, publikacji i jakości w App Store. Praktyczna mapa decyzji dla właściciela firmy, dyrektora technicznego i lidera produktu.

Technologie

Mikroserwisy NestJS: kiedy wydzielić zamówienia z monolitu sprzedażowego?

Decyzyjny przewodnik dla dyrektora technologii i liderów sprzedaży internetowej: kiedy zostawić monolit, kiedy wydzielić obsługę zamówień oraz jak użyć NestJS, RabbitMQ, Redis i stopniowej modernizacji bez ryzyka dla finalizacji zamówienia.

Kontakt

Porozmawiajmy
o projekcie.

Masz pomysł na aplikację lub potrzebujesz wsparcia technologicznego? Napisz do nas — przygotujemy wstępną analizę i wycenę w 48 godzin. Po rozpoznaniu zakresu, projektu i technologii możemy zaproponować gwarancję ceny oraz umowę ze stałą ceną; to nasz wyróżnik na rynku.

Napisz do nas[email protected]
Odwiedź nas
GD
gmi.software Sp. z o.o.ul. Jana Heweliusza 11 / 819
80-890 Gdańsk, Polska
NIP: 5252816287KRS: 0000830003
gmi.
UsługiNasze projektyBlogAsystent briefuKontakt
LIFAINGI
Nominacja Mobile Trends Awards 2025 - aplikacja SFD
© 2026 gmi.software Sp. z o.o.
Polityka prywatnościRegulamin