Next build workers were each opening up to DATABASE_POOL_SIZE connections and exhausting MySQL (pool active=0), hanging sitemap generation. Cap build pool to 5, fail connect faster, limit SSG concurrency, and make sitemap dynamic. Co-authored-by: Cursor <[email protected]>
38 lines
1.4 KiB
TypeScript
38 lines
1.4 KiB
TypeScript
import { PrismaMariaDb } from "@prisma/adapter-mariadb";
|
|
import { env } from "@/env";
|
|
import { PrismaClient } from "@/generated/prisma/client";
|
|
import { resolvePrismaConnectionLimit } from "@/lib/prisma-pool";
|
|
|
|
const globalForPrisma = globalThis as unknown as { prisma?: PrismaClient };
|
|
|
|
function createPrismaClient(): PrismaClient {
|
|
const url = new URL(env.DATABASE_URL);
|
|
const isBuild =
|
|
process.env.NEXT_PHASE === "phase-production-build" ||
|
|
process.env.NEXT_PHASE === "phase-production-compile";
|
|
const connectionLimit = resolvePrismaConnectionLimit(env.DATABASE_POOL_SIZE);
|
|
// Fail fast during SSG so Next can retry/fallback instead of hanging 30s+.
|
|
const connectTimeout = isBuild
|
|
? Math.min(env.DATABASE_CONNECT_TIMEOUT_MS, 5_000)
|
|
: env.DATABASE_CONNECT_TIMEOUT_MS;
|
|
const adapter = new PrismaMariaDb({
|
|
host: url.hostname,
|
|
port: Number(url.port) || 3306,
|
|
user: decodeURIComponent(url.username),
|
|
password: decodeURIComponent(url.password),
|
|
database: url.pathname.replace(/^\//, ""),
|
|
connectionLimit,
|
|
connectTimeout,
|
|
acquireTimeout: connectTimeout,
|
|
idleTimeout: env.DATABASE_IDLE_TIMEOUT_MS,
|
|
});
|
|
return new PrismaClient({
|
|
adapter,
|
|
log: env.NODE_ENV === "development" ? ["error", "warn"] : ["error"],
|
|
});
|
|
}
|
|
|
|
export const prisma = globalForPrisma.prisma ?? createPrismaClient();
|
|
|
|
if (env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
|