diff --git a/internal/bootstrap/db.go b/internal/bootstrap/db.go index 533d5296..55deb31d 100644 --- a/internal/bootstrap/db.go +++ b/internal/bootstrap/db.go @@ -2,6 +2,7 @@ package bootstrap import ( "context" + "database/sql" "fmt" "path/filepath" "strings" @@ -27,7 +28,7 @@ func InitDatabase(ctx context.Context) error { if conf.Conf.Database.CustomDSN != "" { dsn = conf.Conf.Database.CustomDSN } else if conf.Conf.Database.Port == 0 { - dsn = fmt.Sprintf("%s:%s@unix(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local&tls=%s", + dsn = fmt.Sprintf("%s:%s@unix(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local&tls=%s&interpolateParams=true", conf.Conf.Database.User, conf.Conf.Database.Password, conf.Conf.Database.Host, @@ -36,7 +37,7 @@ func InitDatabase(ctx context.Context) error { ) log.Infof("mysql database unix socket: %s", conf.Conf.Database.Host) } else { - dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&tls=%s", + dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&tls=%s&interpolateParams=true", conf.Conf.Database.User, conf.Conf.Database.Password, conf.Conf.Database.Host, @@ -109,11 +110,17 @@ func InitDatabase(ctx context.Context) error { opts = append(opts, &gorm.Config{ TranslateError: true, Logger: newDBLogger(), + PrepareStmt: true, }) d, err := gorm.Open(dialector, opts...) if err != nil { log.Fatalf("failed to connect database: %s", err.Error()) } + sqlDB, err := d.DB() + if err != nil { + log.Fatalf("failed to get sqlDB: %s", err.Error()) + } + initRawDB(sqlDB) return db.Init(d) } @@ -135,3 +142,9 @@ func newDBLogger() logger.Interface { }, ) } + +func initRawDB(db *sql.DB) { + db.SetMaxOpenConns(conf.Conf.Database.MaxOpenConns) + db.SetMaxIdleConns(conf.Conf.Database.MaxIdleConns) + db.SetConnMaxLifetime(time.Duration(conf.Conf.Database.ConnMaxLifetime) * time.Second) +} diff --git a/internal/conf/db.go b/internal/conf/db.go index 453df759..d259884b 100644 --- a/internal/conf/db.go +++ b/internal/conf/db.go @@ -18,6 +18,10 @@ type DatabaseConfig struct { SslMode string `yaml:"ssl_mode" lc:"database ssl mode, default disable" env:"DATABASE_SSL_MODE"` CustomDSN string `yaml:"custom_dsn" lc:"custom dsn, when not empty, it will ignore other config" env:"DATABASE_CUSTOM_DSN"` + + MaxIdleConns int `yaml:"max_idle_conns" lc:"max idle connections (default 10)" env:"DATABASE_MAX_IDLE_CONNS"` + MaxOpenConns int `yaml:"max_open_conns" lc:"max open connections (default 100)" env:"DATABASE_MAX_OPEN_CONNS"` + ConnMaxLifetime int `yaml:"conn_max_lifetime" lc:"connection max lifetime (default 3600 seconds)" env:"DATABASE_CONN_MAX_LIFETIME"` } func DefaultDatabaseConfig() DatabaseConfig { @@ -26,5 +30,9 @@ func DefaultDatabaseConfig() DatabaseConfig { Host: "", DBName: "synctv", SslMode: "disable", + + MaxIdleConns: 10, + MaxOpenConns: 100, + ConnMaxLifetime: 3600, } }