mirror of
https://github.com/kjanat/livedash-node.git
synced 2026-01-16 10:12:09 +01:00
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!
This commit is contained in:
@ -1,20 +1,67 @@
|
||||
// Simple Prisma client setup
|
||||
// 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
|
||||
// This approach avoids NodeJS.Global which is not available
|
||||
|
||||
// Prevent multiple instances of Prisma Client in development
|
||||
declare const global: {
|
||||
prisma: PrismaClient | undefined;
|
||||
};
|
||||
|
||||
// Initialize Prisma Client
|
||||
const prisma = global.prisma || new PrismaClient();
|
||||
// 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";
|
||||
|
||||
// Save in global if we're in development
|
||||
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 };
|
||||
|
||||
Reference in New Issue
Block a user