赛思维服务调研
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.4 KiB

package db
import (
"context"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/go-xorm/xorm"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"SSW_WebPlatform/conf"
"SSW_WebPlatform/utils"
"SSW_WebPlatform/web/middleware/glog"
"log"
"path/filepath"
"sync"
"time"
)
var (
masterEngine *xorm.Engine
Lock sync.Mutex
mgoDb *mongo.Client
mlock sync.Mutex
)
//链接到数据库
func MasterEngine() *xorm.Engine {
//判断masterEngine是否存在
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)
//开启sql,debug
//engine.ShowSQL(true)
if err != nil {
log.Fatal("dbhelper.DbinstanceMaster error= ", err)
return nil
} else {
masterEngine = engine
return masterEngine
}
return masterEngine
}
//创建mongoDb数据库链接
func MgoDb() *mongo.Client {
//判断mgoDb是否存在
if mgoDb != nil {
return mgoDb
}
//创建之前会涉及并发,所以要加锁
mlock.Lock()
defer mlock.Unlock()
//细节,防止多个请求锁住
if mgoDb != nil {
return mgoDb
}
//1.建立链接
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
log.Fatal("dbhelper.MgoDb error= ", err)
return nil
} else {
mgoDb = client
return mgoDb
}
}
//数据备份
func BackUp() {
var (
engine *xorm.Engine
err error
)
c := conf.MasterDbConfig
driveSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8",
c.User, c.Pwd, c.Host, c.Port, c.DbName)
if engine, err = xorm.NewEngine(conf.DriverName, driveSource); err != nil {
return
}
if err = engine.Ping(); err != nil {
glog.ErrorExtln("数据库连接失败:", "err:", err.Error())
return
} else {
glog.ErrorExtln("数据库连接成功:", "driveSource", driveSource)
}
filename := utils.TimeFormat(time.Now(),"yyyy-MM-dd") + ".sql"
dirpath := filepath.Join(c.BackUp,filename)
err = engine.DumpAllToFile(dirpath, conf.DriverName)
if err != nil {
return
}
}