51 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package db
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"log"
 | |
| 	"os"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/jackc/pgx/v5/pgxpool"
 | |
| )
 | |
| 
 | |
| func NewPool(ctx context.Context) (*pgxpool.Pool, error) {
 | |
| 	connStr := os.Getenv("DATABASE_URL")
 | |
| 	if connStr == "" {
 | |
| 		return nil, fmt.Errorf("DATABASE_URL environment variable is not set")
 | |
| 	}
 | |
| 
 | |
| 	config, err := pgxpool.ParseConfig(connStr)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("unable to parse DATABASE_URL: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	config.MaxConns = 100
 | |
| 	config.MinConns = 10
 | |
| 	config.MaxConnLifetime = time.Hour
 | |
| 	config.MaxConnIdleTime = time.Minute
 | |
| 	config.HealthCheckPeriod = 5 * time.Second
 | |
| 
 | |
| 	pool, err := pgxpool.NewWithConfig(ctx, config)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("unable to create connection pool: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	err = pool.Ping(ctx)
 | |
| 	if err != nil {
 | |
| 		pool.Close()
 | |
| 		return nil, fmt.Errorf("unable to ping database: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	log.Println("Database connection pool successfully initialized.")
 | |
| 	return pool, nil
 | |
| }
 | |
| 
 | |
| func ClosePool(pool *pgxpool.Pool) {
 | |
| 	if pool != nil {
 | |
| 		pool.Close()
 | |
| 		log.Println("Database connection pool closed.")
 | |
| 	}
 | |
| }
 | 
