db: connection retry logic
This commit is contained in:
parent
3e307658fa
commit
7e69320d2c
1 changed files with 42 additions and 21 deletions
|
@ -16,27 +16,7 @@ import (
|
|||
var DB *gorm.DB
|
||||
|
||||
func Start() {
|
||||
host := os.Getenv("DB_HOST")
|
||||
port := os.Getenv("DB_PORT")
|
||||
user := os.Getenv("DB_USER")
|
||||
password := os.Getenv("DB_PASSWORD")
|
||||
dbname := os.Getenv("DB_NAME")
|
||||
|
||||
connectionString := fmt.Sprintf(
|
||||
"%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True",
|
||||
user, password, host, port, dbname,
|
||||
)
|
||||
db, err := gorm.Open(mysql.Open(connectionString), &gorm.Config{
|
||||
Logger: logger.Default.LogMode(logger.Silent),
|
||||
NowFunc: func() time.Time {
|
||||
utc, _ := time.LoadLocation("Europe/Rome")
|
||||
return time.Now().In(utc)
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalf("failed to connect to database: %v", err)
|
||||
}
|
||||
DB = db
|
||||
DB = connect()
|
||||
sqlDB, err := DB.DB()
|
||||
if err != nil {
|
||||
log.Fatalf("failed to get database connection: %v", err)
|
||||
|
@ -54,6 +34,47 @@ func Start() {
|
|||
}
|
||||
}
|
||||
|
||||
func connect() *gorm.DB {
|
||||
host := os.Getenv("DB_HOST")
|
||||
port := os.Getenv("DB_PORT")
|
||||
user := os.Getenv("DB_USER")
|
||||
password := os.Getenv("DB_PASSWORD")
|
||||
dbname := os.Getenv("DB_NAME")
|
||||
|
||||
connectionString := fmt.Sprintf(
|
||||
"%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True",
|
||||
user, password, host, port, dbname,
|
||||
)
|
||||
|
||||
var conn *gorm.DB
|
||||
var err error
|
||||
|
||||
maxRetries := 10
|
||||
retryCount := 0
|
||||
|
||||
for retryCount < maxRetries {
|
||||
conn, err = gorm.Open(mysql.Open(connectionString), &gorm.Config{
|
||||
Logger: logger.Default.LogMode(logger.Silent),
|
||||
NowFunc: func() time.Time {
|
||||
utc, _ := time.LoadLocation("Europe/Rome")
|
||||
return time.Now().In(utc)
|
||||
},
|
||||
})
|
||||
if err == nil {
|
||||
break
|
||||
}
|
||||
retryCount++
|
||||
log.Printf("failed to connect to database (attempt %d/%d)", retryCount, maxRetries)
|
||||
if retryCount < maxRetries {
|
||||
time.Sleep(2 * time.Second)
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
log.Fatalf("failed to connect to database after %d attempts: %v", maxRetries, err)
|
||||
}
|
||||
return conn
|
||||
}
|
||||
|
||||
func migrateDatabase() error {
|
||||
err := DB.AutoMigrate(
|
||||
&models.Media{},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue