package goblocks import ( "database/sql" "log/slog" "sync" "time" _ "github.com/go-sql-driver/mysql" ) const maxOpenDbConn = 10 const maxIdleDbConn = 5 const maxDbLifetime = time.Minute * 5 var ( mysqlDBs = make(map[string]*sql.DB) mysqlMutex sync.RWMutex ) func (a *App) NewMySQL(name string) (*sql.DB, error) { mysqlMutex.Lock() defer mysqlMutex.Unlock() if db, exists := mysqlDBs[name]; exists { return db, nil } d, err := sql.Open("mysql", a.Datasource(name)) if err != nil { slog.Error("error connecting to database", "error", err, "name", name) return nil, err } d.SetMaxOpenConns(maxOpenDbConn) d.SetMaxIdleConns(maxIdleDbConn) d.SetConnMaxLifetime(maxDbLifetime) if err := d.Ping(); err != nil { slog.Error("error pinging database", "error", err, "name", name) return nil, err } mysqlDBs[name] = d slog.Info("connected to database", "name", name) return d, nil } func (a *App) GetMySQL(name string) (*sql.DB, bool) { mysqlMutex.RLock() defer mysqlMutex.RUnlock() db, exists := mysqlDBs[name] return db, exists } func (a *App) CloseMySQLDBs() { mysqlMutex.Lock() defer mysqlMutex.Unlock() for name, db := range mysqlDBs { db.Close() delete(mysqlDBs, name) slog.Info("closed database connection", "name", name) } }