package db import ( "database/sql" "fmt" "log" "os" "time" _ "github.com/go-sql-driver/mysql" ) // DB is the global database connection pool var DB *sql.DB func InitDB() (*sql.DB, error) { // Get connection details from environment variables (loaded in main) connStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true", os.Getenv("DB_USER"), os.Getenv("DB_PASSWORD"), os.Getenv("DB_HOST"), os.Getenv("DB_PORT"), os.Getenv("DB_NAME"), ) // Open the database connection var err error DB, err = sql.Open("mysql", connStr) if err != nil { return nil, fmt.Errorf("error opening database: %v", err) } // Set connection pool parameters optimized for horizontal scaling // Lower per-replica to allow more replicas without exhausting DB connections DB.SetMaxOpenConns(25) // Maximum number of open connections to the database DB.SetMaxIdleConns(10) // Maximum number of connections in the idle connection pool DB.SetConnMaxLifetime(5 * time.Minute) // Maximum amount of time a connection may be reused // Check if the database connection is working err = DB.Ping() if err != nil { log.Printf("Database connection lost: %v. Reconnecting...", err) DB, err = InitDB() if err != nil { log.Printf("Failed to reconnect to database: %v", err) } } log.Print("Database connected successfully!") return DB, nil }