package database import ( "context" "database/sql" "fmt" "time" _ "github.com/lib/pq" ) type DB struct { *sql.DB } type DBConfig struct { MaxOpenConns int MaxIdleConns int ConnMaxLifetime time.Duration ConnMaxIdleTime time.Duration } func NewConnection(databaseURL string) (*DB, error) { return NewConnectionWithConfig(databaseURL, DBConfig{ MaxOpenConns: 25, MaxIdleConns: 25, ConnMaxLifetime: 5 * time.Minute, ConnMaxIdleTime: 5 * time.Minute, }) } func NewConnectionWithConfig(databaseURL string, config DBConfig) (*DB, error) { db, err := sql.Open("postgres", databaseURL) if err != nil { return nil, fmt.Errorf("unable to open database: %w", err) } // Configure connection pool db.SetMaxOpenConns(config.MaxOpenConns) db.SetMaxIdleConns(config.MaxIdleConns) db.SetConnMaxLifetime(config.ConnMaxLifetime) db.SetConnMaxIdleTime(config.ConnMaxIdleTime) // Test the connection if err := db.PingContext(context.Background()); err != nil { return nil, fmt.Errorf("unable to ping database: %w", err) } return &DB{DB: db}, nil } func (db *DB) Health(ctx context.Context) error { return db.PingContext(ctx) } // Stats returns connection pool statistics for monitoring func (db *DB) Stats() sql.DBStats { return db.Stats() }