package gorm import ( "log" "os" "sync" "time" "gorm.io/driver/postgres" "gorm.io/gorm" gormlogger "gorm.io/gorm/logger" ) var db *gorm.DB var mu = sync.Mutex{} func GetDB() *gorm.DB { if db != nil { return db } mu.Lock() defer mu.Unlock() if db == nil { var err error logLevel := gormlogger.Warn if os.Getenv("DB_DEBUG") == "true" { logLevel = gormlogger.Info } db, err = gorm.Open(postgres.Open(os.Getenv("POSTGRESQL_DSN")), &gorm.Config{ Logger: gormlogger.New( log.Default(), gormlogger.Config{ SlowThreshold: time.Second, // Slow SQL threshold LogLevel: logLevel, // Log level Colorful: false, // Disable color }, ), }) if err != nil { log.Fatal(err) } sqlDB, err := db.DB() if err != nil { log.Fatalf("failed to get sql db: %s", err.Error()) return nil } sqlDB.SetConnMaxIdleTime(3 * time.Minute) sqlDB.SetConnMaxLifetime(10 * time.Minute) sqlDB.SetMaxIdleConns(1) sqlDB.SetMaxOpenConns(10) } return db }