fix(prisma): cache de client in álle omgevingen + honoreer connection_limit #171
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/prisma-singleton-pool"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Waarom
scrum4me-postgresliep op 2026-08-16 vol op 100/100 client backends — inclusief de 3superuser_reserved_connections, waardoor zelfspsqler niet meer in kon enpg_terminate_backend()onbereikbaar was (dat vereist zelf een connectie). EersteFATAL: sorry, too many clients alreadyop 2026-08-15 06:28 UTC, daarna 4.526× in 96 uur.Eén
next-server-proces hield 43 van de 100 connecties vast. Twee defecten inlib/prisma.tssamen:1. De singleton-guard stond omgekeerd voor productie
In productie werd
globalForPrisma.prismadus nooit gezet. Elke module-scope dielib/prismaimporteert draaidecreatePrismaClient()opnieuw → eigenPrismaClient+ eigenpg.Pool. Het standaard-Next.js-patroon beschermt tegen HMR in dev; tegen Next's per-route bundling in prod beschermt het niets. Daarom liep het langzaam vol in plaats van in één klap: elke nieuw geraakte route-bundle kan er tot 10 connecties bij pakken.2.
connection_limitin de URL is dode config bij de driver-adapter.envheeft?connection_limit=10&pool_timeout=20, maarnew Pool({ connectionString: url })kreeg geenmax. Met dePrismaPg-adapter pooled node-postgres, niet Prisma's Rust-pool — enpgkent die parameter niet. Geverifieerd op de geïnstalleerdepg8.20.0:psqlweigert dezelfde URL zelfs metinvalid URI query parameter: "connection_limit". Wie die waarde bijstelde om het probleem te verhelpen, veranderde dus niets.Wat deze PR doet
globalThisin álle omgevingen.lib/prisma-pool.tsmetpoolMaxFromUrl(), dieconnection_limituitDATABASE_URLleest en alsmaxaan de pool geeft. Valt terug op 10 bij een ontbrekende, niet-positieve, niet-hele of niet-URL-vormige waarde (pgaccepteert ookhost=... dbname=...). Eigen module omdatlib/prisma.tsbij import een client aanmaakt en daar dus niets uit te testen valt.Bewust niet in deze PR: de connection string wordt ongewijzigd doorgegeven aan
pg. Herschrijven vianew URL().toString()zou het wachtwoord kunnen her-encoderen — dat risico is die cosmetiek niet waard.Verificatie
npx vitest run __tests__/lib/prisma-pool.test.ts→ 5/5 passnpx eslintop de drie bestanden → exit 0npm run typecheck→ 296 fouten mét én zónder deze wijziging; diff van de foutregels is leeg. Geen enkele fout verwijst naarlib/prisma*. (De 296 zijn pre-existing in de dev-clone — stale generated client / dirtyvendor/scrum4me-shared.)npm test→ 17 falende regels mét én zónder deze wijziging; niets nieuw en niets stilletjes opgelost.Nog open (buiten deze PR)
Postgres heeft géén
idle_session_timeouten géénidle_in_transaction_session_timeout(beide uit), dus er is geen vangnet als een client alsnog connecties laat staan. Dat stond bij het vorige pool-incident (juli, MCP-wezen) al genoteerd als openstaand punt en raakt de gedeelde prod-DB — apart te besluiten.