package k8s_manager import ( "fmt" "github.com/sirupsen/logrus" "gorm.io/driver/mysql" "gorm.io/gorm" "sync" ) var instance *gorm.DB = nil var lock sync.Mutex func opendb() *gorm.DB { if instance == nil { lock.Lock() if instance == nil { db_host := GetConfig().DBHost db_user := GetConfig().DBUser db_pass := GetConfig().DBPassword dsn := fmt.Sprintf("%s:%s@tcp(%s:3306)/k8s?charset=utf8mb4&parseTime=True&loc=Local", db_user, db_pass, db_host) var err error instance, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { logrus.WithError(err).Error("Cannot open database.") instance = nil } } lock.Unlock() } return instance } func checkdb(cnt int) *gorm.DB { ans := opendb() if ans == nil { return nil } db, err := ans.DB() if err != nil { logrus.WithError(err).Error("Cannot get *sql.DB.") db = nil } if db != nil { err = db.Ping() if err != nil { logrus.WithError(err).Errorf("Ping error %d.", cnt) err = db.Close() if err != nil { logrus.WithError(err).Errorf("Close error %d.", cnt) } instance = nil ans = nil } } return ans } func DB() *gorm.DB { ans := checkdb(1) if ans != nil { return ans } instance = nil return checkdb(2) }