diff --git a/dao/db.go b/dao/db.go index fe25287..0c3c769 100644 --- a/dao/db.go +++ b/dao/db.go @@ -7,11 +7,15 @@ import ( "gorm.io/driver/sqlite" "gorm.io/gorm" "log" + "sync" "videoplayer/proto" ) var DB *gorm.DB +var DBMMap map[uint]*proto.DBValue +var DBMMapRWMutex = &sync.RWMutex{} //dbm日志 + func Init() error { var db *gorm.DB var err error diff --git a/main.go b/main.go index 55e6df0..a40bbd9 100644 --- a/main.go +++ b/main.go @@ -232,6 +232,7 @@ func myTask() { RunGeneralCron() service.ShellWillRunFromServer() service.SyncTokenSecretFromUserCenter() + service.DelDBMMap() //定时处理DBMMap中的数据 } diff --git a/proto/conf.go b/proto/conf.go index 9df4ed6..073a7c4 100644 --- a/proto/conf.go +++ b/proto/conf.go @@ -27,13 +27,13 @@ var SigningKeyIsValid = true // 是否有效的签名密钥 const ( MYSQL_USER = "video_t2" MYSQL_DB = "video_t2" - MYSQL_PASSWORD = "2t2SKHmWEYj2xFKF" + MYSQL_PASSWORD = "2fdreYj2xFKF" MYSQL_PORT = "3306" MYSQL_HOST = "127.0.0.1" MYSQL_DSN = MYSQL_USER + ":" + MYSQL_PASSWORD + "@tcp(" + MYSQL_HOST + ":" + MYSQL_PORT + ")/" + MYSQL_DB + "?charset=utf8mb4&parseTime=True&loc=Local" REDIS_ADDR = "127.0.0.1:6379" - REDIS_PASSWORD = "lj502138" + REDIS_PASSWORD = "lgybvueiogvter" REIDS_DB = 2 TOKEN_SECRET = "mfjurnc_32ndj9dfhj" @@ -43,6 +43,8 @@ const ( // 以下是文件上传的配置 FILE_BASE_DIR = "/home/lijun/file/" + + DBMMap_Max_Keep_Time = 10 * 60 //DBMap中的数据最大保持时间,10min ) const ( diff --git a/proto/dbm.go b/proto/dbm.go index db3da16..5fa408b 100644 --- a/proto/dbm.go +++ b/proto/dbm.go @@ -111,3 +111,8 @@ type DBTableAttribute struct { ColumnName string `json:"column_name"` // 列名 ColumnType string `json:"column_type"` // 列类型 } + +type DBValue struct { + LastUserTime int64 `json:"last_user_time"` + Value *gorm.DB `json:"value"` +} diff --git a/service/dbmService.go b/service/dbmService.go index 31fbd9a..cddedb0 100644 --- a/service/dbmService.go +++ b/service/dbmService.go @@ -8,6 +8,7 @@ import ( "strconv" "videoplayer/dao" "videoplayer/proto" + "videoplayer/worker" ) func RunSQL(req *proto.RunSQLRequest) (*proto.SQLResult, error) { @@ -37,6 +38,16 @@ func RunSQL(req *proto.RunSQLRequest) (*proto.SQLResult, error) { } func GetGORMDBObject(dbmInfo *proto.DBManage) (db_ *gorm.DB, err error) { + dao.DBMMapRWMutex.RLock() + defer dao.DBMMapRWMutex.RUnlock() + if dao.DBMMap != nil { + dbValue := dao.DBMMap[dbmInfo.ID] + if dbValue != nil { + dbValue.LastUserTime = worker.GetCurrentTimestamp() + return dbValue.Value, nil + } + } + switch dbmInfo.DB_Type { case proto.DB_TYPE_MYSQL: // MySQL dsn := dbmInfo.DB_User + ":" + dbmInfo.DB_Password + "@tcp(" + dbmInfo.DB_IP + ":" + strconv.Itoa(int(dbmInfo.DB_Port)) + ")/" + dbmInfo.DB_NAME + "?charset=utf8mb4&parseTime=True&loc=Local" @@ -53,6 +64,13 @@ func GetGORMDBObject(dbmInfo *proto.DBManage) (db_ *gorm.DB, err error) { default: err = errors.New("unsupported database type") } + + dao.DBMMapRWMutex.Lock() + defer dao.DBMMapRWMutex.Unlock() + var dbValue *proto.DBValue + dbValue.Value = db_ + dbValue.LastUserTime = worker.GetCurrentTimestamp() + dao.DBMMap[dbmInfo.ID] = dbValue return db_, err } @@ -218,3 +236,14 @@ func GetDBTableDesc(req *proto.GetDBTableDescReq, userId int) (*proto.SQLResult, //} return nil, nil } + +func DelDBMMap() { + dao.DBMMapRWMutex.Lock() + defer dao.DBMMapRWMutex.Unlock() + cur := worker.GetCurrentTimestamp() + for k, v := range dao.DBMMap { + if cur-v.LastUserTime < proto.DBMMap_Max_Keep_Time { + delete(dao.DBMMap, k) //删除 + } + } +}