package db import ( "Open_IM/src/common/config" "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" "sync" "time" ) type mysqlDB struct { sync.RWMutex dbMap map[string]*gorm.DB } func (m *mysqlDB) DefaultGormDB() (*gorm.DB, error) { return m.GormDB(config.Config.Mysql.DBAddress[0], config.Config.Mysql.DBDatabaseName) } func (m *mysqlDB) GormDB(dbAddress, dbName string) (*gorm.DB, error) { m.Lock() defer m.Unlock() k := key(dbAddress, dbName) if _, ok := m.dbMap[k]; !ok { if err := m.open(dbAddress, dbName); err != nil { return nil, err } } return m.dbMap[k], nil } func (m *mysqlDB) open(dbAddress, dbName string) error { dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=true&loc=Local", config.Config.Mysql.DBUserName, config.Config.Mysql.DBPassword, dbAddress, dbName) db, err := gorm.Open("mysql", dsn) if err != nil { return err } db.SingularTable(true) db.DB().SetMaxOpenConns(config.Config.Mysql.DBMaxOpenConns) db.DB().SetMaxIdleConns(config.Config.Mysql.DBMaxIdleConns) db.DB().SetConnMaxLifetime(time.Duration(config.Config.Mysql.DBMaxLifeTime) * time.Second) if m.dbMap == nil { m.dbMap = make(map[string]*gorm.DB) } k := key(dbAddress, dbName) m.dbMap[k] = db return nil }