Prisma Connection Pool Fix¶
Problem¶
Nach der Implementierung des dynamischen Feld-Mappings traten folgende Fehler auf:
Error: Too many database connections opened: FATAL: tut mir leid, schon zu viele Verbindungen
Error: Can't reach database server at `192.168.1.51:5432`
Ursache¶
In allen Route-Dateien wurde jeweils eine neue PrismaClient-Instanz erstellt:
// FALSCH - Erstellt bei jedem Request eine neue Verbindung
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
Dies führte zu: - Connection Pool Exhaustion: Hunderte offene Datenbankverbindungen - Memory Leaks: Jede PrismaClient-Instanz benötigt Speicher - Performance-Probleme: Langsame Responses durch Verbindungs-Overhead
Lösung: Singleton Pattern¶
1. Zentraler Prisma Client¶
Neue Datei server/src/lib/prisma.ts:
import { PrismaClient } from '@prisma/client'
const globalForPrisma = global as unknown as { prisma: PrismaClient }
export const prisma =
globalForPrisma.prisma ||
new PrismaClient({
log: process.env.DEBUG === 'true' ? ['query', 'error', 'warn'] : ['error'],
})
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
export default prisma
2. Verwendung in Routes¶
// RICHTIG - Importiert den Singleton
import prisma from '../lib/prisma';
// ENTFERNT:
// import { PrismaClient } from '@prisma/client';
// const prisma = new PrismaClient();
Betroffene Dateien¶
Sofort behoben (wegen 500 Errors):¶
- ✅
server/src/routes/formulas.ts - ✅
server/src/routes/disciplineGroups.ts - ✅
server/src/routes/layouts.ts
TODO - Alle anderen Route-Dateien sollten aktualisiert werden:¶
server/src/routes/auditLogs.tsserver/src/routes/competition-status.tsserver/src/routes/configuration.tsserver/src/routes/eventParticipants.tsserver/src/routes/events.tsserver/src/routes/medals_broken.tsserver/src/routes/medals-simple.tsserver/src/routes/medals_old.tsserver/src/routes/medals_ultra_simple.tsserver/src/routes/meldematrix.tsserver/src/routes/participants_simple.tsserver/src/routes/persons.tsserver/src/routes/refreshTokens.tsserver/src/routes/regions.tsserver/src/routes/sports.tsserver/src/routes/scores.tsserver/src/routes/statuses.tsserver/src/routes/teams.tsserver/src/routes/squadManagement.ts
Vorteile¶
1. Performance¶
- ✅ Wiederverwendung der Datenbankverbindung
- ✅ Kein Connection Pool Exhaustion
- ✅ Schnellere Request-Zeiten
2. Ressourcen¶
- ✅ Reduzierter Speicherverbrauch
- ✅ Weniger DB-Verbindungen
- ✅ Effiziente Connection Pool Nutzung
3. Stabilität¶
- ✅ Keine "Too many connections" Fehler mehr
- ✅ Konsistentes Logging (zentral konfigurierbar)
- ✅ Bessere Fehlerbehandlung
Debug-Modus¶
Wenn DEBUG=true gesetzt ist, werden alle Queries geloggt:
Best Practices¶
DO ✅¶
import prisma from '../lib/prisma';
router.get('/', async (req, res) => {
const data = await prisma.tfx_formeln.findMany();
res.json(data);
});
DON'T ❌¶
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient(); // Creates new instance!
router.get('/', async (req, res) => {
const data = await prisma.tfx_formeln.findMany();
res.json(data);
});
Datum¶
2025-01-15 - Implementiert als Hotfix für Connection Pool Probleme nach Dynamic Field Mapping