import { PrismaPg } from "@prisma/adapter-pg"; import { PrismaMariaDb } from "@prisma/adapter-mariadb"; /** * Gleichzeitig offene Datenbankverbindungen dieses Prozesses. * * Ohne Angabe nimmt node-postgres 10. Das reicht im Alltag mühelos, wird aber * beim Andrang zur Obergrenze: eine Bestellung haelt ihre Verbindung ueber * die gesamte Transaktion (Bestandsreservierung, Gutscheinpruefung, * Bestellanlage), und Prisma gibt einer Transaktion nur begrenzt Zeit, * ueberhaupt eine Verbindung zu bekommen (maxWait). Sind alle zehn belegt, * scheitern weitere Checkouts nicht an der Sache, sondern am Warten. * * 20 ist bewusst moderat: PostgreSQL erlaubt in der Voreinstellung 100 * gleichzeitige Verbindungen, und daneben brauchen noch der Aufraeum-CronJob, * die Sicherung und gelegentlich eine Konsole welche. Die Anwendung laeuft * ausserdem mit einer einzigen Instanz (siehe k8s/05-app-deployment.yaml) — * bei mehreren Instanzen multipliziert sich dieser Wert und will neu bedacht * werden. */ const POOL_SIZE = 20; /** * Wie lange eine Anfrage auf eine freie Verbindung wartet, bevor sie * aufgibt. Lieber ein klarer Fehler nach zehn Sekunden als eine Seite, die * ewig laedt — und im Log ein Hinweis darauf, dass der Pool zu klein ist. */ const POOL_ACQUIRE_TIMEOUT_MS = 10_000; /** * Prisma 7 liest die Verbindung nicht mehr aus dem Schema, sondern erfordert * einen expliziten Treiber-Adapter im Client — welcher, haengt von * DATABASE_PROVIDER ab (muss zum "provider" passen, den * scripts/prisma-provider.mjs zuletzt in prisma/schema.prisma geschrieben * hat). Gemeinsam genutzt von lib/prisma.ts (App-Laufzeit) und * prisma/seed.ts (Standalone-Skript), damit beide immer denselben Provider * verwenden. */ export function createDbAdapter(): PrismaPg | PrismaMariaDb { const provider = (process.env.DATABASE_PROVIDER ?? "postgresql").trim(); const connectionString = process.env.DATABASE_URL; if (!connectionString) throw new Error("DATABASE_URL ist nicht gesetzt."); if (provider === "mysql") { // Bewusst unveraendert die Verbindungszeichenkette: der MariaDB-Adapter // nimmt entweder sie ODER ein Einstellungsobjekt aus Host, Benutzer, // Passwort und Datenbank — beides zugleich geht nicht, die Zeichenkette // muesste also zerlegt werden. Der Produktivbetrieb laeuft auf // PostgreSQL (DATABASE_PROVIDER-Vorgabe); fuer MySQL gilt weiterhin die // Voreinstellung des Treibers. return new PrismaMariaDb(connectionString); } return new PrismaPg({ connectionString, max: POOL_SIZE, // Ohne Zeitgrenze wartet eine Anfrage unbegrenzt auf eine freie // Verbindung. Unter Andrang staut sich dann alles lautlos auf, statt dass // irgendwo ein Fehler sichtbar wuerde. connectionTimeoutMillis: POOL_ACQUIRE_TIMEOUT_MS, }); }