## Summary This branch contains several bug fixes and performance improvements, primarily focusing on: - Database connection management - MQTT client stability - Logging optimization - API enhancements ## Detailed Changes ### Fixed Issues 1. **Database Connection Management** - Removed from user-validate API route to prevent connection pool exhaustion - Added proper connection handling in global Prisma setup - Reduced logging verbosity in production environments 2. **MQTT Client Improvements** - Enhanced MQTT client initialization with proper error handling - Added reconnection logic with configurable intervals - Implemented cleanup functions to prevent memory leaks - Added separate initialization logic for server and client-side code 3. **Logging Optimization** - Removed excessive logging in middleware that was causing high CPU usage - Configured appropriate log levels for development and production 4. **Component Stability** - Added safety checks in text editor component to prevent MQTT operations on the server side - Improved MQTT publishing logic with client availability checks ### New Files - - Utility functions for safe database operations ### Modified Files 1. - Removed problematic call 2. - Configured different logging levels for dev/prod - Removed process listeners that were causing disconnections - Exported prisma instance separately 3. - Removed excessive logging statements 4. - Enhanced initialization with error handling - Added reconnection and timeout configurations 5. - Added proper cleanup functions - Improved connection handling 6. - Added MQTT client availability checks - Prevented server-side MQTT operations ### Performance Improvements - Reduced database connection overhead - Optimized MQTT connection handling - Eliminated unnecessary logging in production - Better memory management with proper cleanup functions ### No Issue
46 lines
1.2 KiB
TypeScript
46 lines
1.2 KiB
TypeScript
import { PrismaClient } from "@prisma/client";
|
|
|
|
// Deklarasikan variabel global untuk menandai apakah listener sudah ditambahkan
|
|
declare global {
|
|
var prisma: PrismaClient;
|
|
var prismaListenersAdded: boolean; // Flag untuk menandai listener
|
|
}
|
|
|
|
let prisma: PrismaClient;
|
|
|
|
if (process.env.NODE_ENV === "production") {
|
|
prisma = new PrismaClient({
|
|
// Reduce logging in production to improve performance
|
|
log: ['error', 'warn'],
|
|
});
|
|
} else {
|
|
if (!global.prisma) {
|
|
global.prisma = new PrismaClient({
|
|
log: ['error', 'warn', 'info', 'query'], // More verbose logging in development
|
|
});
|
|
}
|
|
prisma = global.prisma;
|
|
}
|
|
|
|
// Tambahkan listener hanya jika belum ditambahkan sebelumnya
|
|
if (!global.prismaListenersAdded) {
|
|
// Handle graceful shutdown
|
|
process.on("SIGINT", async () => {
|
|
console.log("Received SIGINT signal. Closing database connections...");
|
|
await prisma.$disconnect();
|
|
process.exit(0);
|
|
});
|
|
|
|
process.on("SIGTERM", async () => {
|
|
console.log("Received SIGTERM signal. Closing database connections...");
|
|
await prisma.$disconnect();
|
|
process.exit(0);
|
|
});
|
|
|
|
// Tandai bahwa listener sudah ditambahkan
|
|
global.prismaListenersAdded = true;
|
|
}
|
|
|
|
export default prisma;
|
|
export { prisma };
|