package datasource import ( "fmt" _ "github.com/go-sql-driver/mysql" "log" "sync" "xorm.io/xorm" "xorm.io/xorm/caches" log2 "xorm.io/xorm/log" "xorm.io/xorm/names" "xps/conf" ) var ( masterEngine *xorm.Engine slaveEngine *xorm.Engine idDbEngine *xorm.Engine lock sync.Mutex ) func InstanceMaster() *xorm.Engine { if masterEngine != nil { return masterEngine } lock.Lock() defer lock.Unlock() if masterEngine != nil { return masterEngine } c := conf.MasterDbConfig driveSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", c.User, c.Pwd, c.Host, c.Port, c.DbName) engine, err := xorm.NewEngine(conf.DriverName, driveSource) if err != nil { log.Fatal("dbhelper", "DbInstanceMaster", err) return nil } //Debug mode engine.ShowSQL(true) engine.Logger().SetLevel(log2.LOG_DEBUG) //Log engine.SetTZLocation(conf.SysTimeLocation) //performance cacher := caches.NewLRUCacher(caches.NewMemoryStore(), 1000) engine.SetDefaultCacher(cacher) masterEngine = engine return engine } // InstanceSlave Slave func InstanceSlave() *xorm.Engine { if slaveEngine != nil { return slaveEngine } lock.Lock() defer lock.Unlock() if slaveEngine != nil { return slaveEngine } c := conf.SlaveDbConfig driveSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", c.User, c.Pwd, c.Host, c.Port, c.DbName) engine, err := xorm.NewEngine(conf.DriverName, driveSource) if err != nil { log.Fatal("dbhelper", "DbInstanceMaster", err) return nil } engine.SetTZLocation(conf.SysTimeLocation) engine.SetColumnMapper(names.SnakeMapper{}) slaveEngine = engine return engine } // InstanceIDServer Slave func InstanceIDServer() *xorm.Engine { if idDbEngine != nil { return idDbEngine } lock.Lock() defer lock.Unlock() if idDbEngine != nil { return idDbEngine } c := conf.IDDbConfig driveSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", c.User, c.Pwd, c.Host, c.Port, c.DbName) engine, err := xorm.NewEngine(conf.DriverName, driveSource) if err != nil { log.Fatal("dbhelper", "DbInstanceIDServer", err) return nil } engine.SetTZLocation(conf.SysTimeLocation) idDbEngine = engine return engine }