44 lines
1.5 KiB
JavaScript
44 lines
1.5 KiB
JavaScript
|
|
// PostgreSQL Connection Pool
|
||
|
|
// All route files import this module instead of receiving a sqlite3 `db` parameter.
|
||
|
|
// Configured via DATABASE_URL environment variable.
|
||
|
|
|
||
|
|
const { Pool } = require('pg');
|
||
|
|
|
||
|
|
if (!process.env.DATABASE_URL) {
|
||
|
|
console.error('[DB] FATAL: DATABASE_URL environment variable is not set.');
|
||
|
|
console.error('[DB] Expected format: postgresql://user:password@host:port/database');
|
||
|
|
process.exit(1);
|
||
|
|
}
|
||
|
|
|
||
|
|
const pool = new Pool({
|
||
|
|
connectionString: process.env.DATABASE_URL,
|
||
|
|
max: 10, // Maximum connections in pool
|
||
|
|
idleTimeoutMillis: 30000, // Close idle connections after 30s
|
||
|
|
connectionTimeoutMillis: 5000, // Fail if connection takes >5s
|
||
|
|
});
|
||
|
|
|
||
|
|
// Log unexpected pool errors (connection drops, etc.)
|
||
|
|
pool.on('error', (err) => {
|
||
|
|
console.error('[DB Pool] Unexpected error on idle client:', err.message);
|
||
|
|
});
|
||
|
|
|
||
|
|
// Track active connections and warn when approaching exhaustion
|
||
|
|
let _activeCount = 0;
|
||
|
|
pool.on('acquire', () => {
|
||
|
|
_activeCount++;
|
||
|
|
if (_activeCount >= 8) {
|
||
|
|
console.warn(`[DB Pool] WARNING: ${_activeCount}/10 connections active — approaching exhaustion`);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
pool.on('release', () => { _activeCount--; });
|
||
|
|
|
||
|
|
// Health check — verify connection on startup
|
||
|
|
pool.query('SELECT NOW()')
|
||
|
|
.then(() => console.log('[DB Pool] Connected to PostgreSQL'))
|
||
|
|
.catch((err) => {
|
||
|
|
console.error('[DB Pool] Failed to connect:', err.message);
|
||
|
|
console.error('[DB Pool] Check DATABASE_URL and ensure Postgres is running on port 5433');
|
||
|
|
});
|
||
|
|
|
||
|
|
module.exports = pool;
|