go-blocks/mysql.go
2025-05-11 11:54:21 +02:00

66 lines
1.3 KiB
Go

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)
}
}