Files
livedash-node/lib/prisma.ts
Kaj Kowalski 0e526641ce feat: implement comprehensive database connection pooling optimization
🎯 SESSION POOLING PERFORMANCE BREAKTHROUGH!

 Critical Issues Fixed:
- Eliminated multiple PrismaClient instances across schedulers
- Fixed connection pool exhaustion risk in processing modules
- Implemented singleton pattern for all database connections
- Added graceful shutdown and connection cleanup

🚀 Enhanced Pooling Features:
- Dual-mode connection pooling (standard + enhanced)
- PostgreSQL native pooling with @prisma/adapter-pg
- Advanced connection monitoring and health checks
- Configurable pool limits and timeouts via environment variables
- Real-time connection statistics and metrics

📊 Performance Optimizations:
- Single shared connection pool across all schedulers
- Configurable connection limits (DATABASE_CONNECTION_LIMIT=20)
- Idle timeout management (DATABASE_POOL_TIMEOUT=10)
- Connection cycling and health validation
- Process termination signal handling

🛠️ New Infrastructure:
- lib/database-pool.ts - Advanced pooling configuration
- app/api/admin/database-health/route.ts - Connection monitoring
- Enhanced lib/prisma.ts with dual-mode support
- Comprehensive documentation in docs/database-connection-pooling.md
- Graceful shutdown handling in lib/schedulers.ts

🎛️ Environment Configuration:
- USE_ENHANCED_POOLING=true for production optimization
- DATABASE_CONNECTION_LIMIT for pool size control
- DATABASE_POOL_TIMEOUT for idle connection management
- Automatic enhanced pooling in production environments

📈 Expected Impact:
- Eliminates connection pool exhaustion under load
- Reduces memory footprint from idle connections
- Improves scheduler performance and reliability
- Enables better resource monitoring and debugging
- Supports horizontal scaling with proper connection management

Production-ready connection pooling with monitoring and health checks!
2025-06-29 09:40:57 +02:00

68 lines
1.8 KiB
TypeScript

// Enhanced Prisma client setup with connection pooling
import { PrismaClient } from "@prisma/client";
import { createEnhancedPrismaClient } from "./database-pool.js";
import { env } from "./env.js";
// Add prisma to the NodeJS global type
declare const global: {
prisma: PrismaClient | undefined;
};
// Connection pooling configuration
const createPrismaClient = () => {
// Use enhanced pooling in production or when explicitly enabled
const useEnhancedPooling =
process.env.NODE_ENV === "production" ||
process.env.USE_ENHANCED_POOLING === "true";
if (useEnhancedPooling) {
console.log("Using enhanced database connection pooling with PG adapter");
return createEnhancedPrismaClient();
}
// Default Prisma client with basic configuration
return new PrismaClient({
log:
process.env.NODE_ENV === "development"
? ["query", "error", "warn"]
: ["error"],
datasources: {
db: {
url: env.DATABASE_URL,
},
},
});
};
// Initialize Prisma Client with singleton pattern
const prisma = global.prisma || createPrismaClient();
// Save in global if we're in development to prevent multiple instances
if (process.env.NODE_ENV !== "production") {
global.prisma = prisma;
}
// Graceful shutdown handling
const gracefulShutdown = async () => {
console.log("Gracefully disconnecting from database...");
await prisma.$disconnect();
process.exit(0);
};
// Handle process termination signals
process.on("SIGINT", gracefulShutdown);
process.on("SIGTERM", gracefulShutdown);
// Connection health check
export const checkDatabaseConnection = async (): Promise<boolean> => {
try {
await prisma.$queryRaw`SELECT 1`;
return true;
} catch (error) {
console.error("Database connection failed:", error);
return false;
}
};
export { prisma };